2009-08-07 4 views
127

J'ai une question Rails.Rails - nom de l'action du contrôleur à la chaîne

Comment obtenir le nom d'une action du contrôleur dans l'action du contrôleur?

Par exemple, au lieu de

def create 
    logger.info("create") 
end 

Je veux écrire quelque chose comme

def create 
    logger.info(this_def_name) 
end 

Qu'est-ce qu'un moyen d'obtenir this_def_name?

Répondre

287

Rails 2.X: @controller.action_name

Rails 3.1.x: controller.action_name, action_name

Rails 4.X: action_name

+5

ou' controller.action_name 'dans Rails 3.0. C'est le meilleur moyen d'accéder au nom de l'action dans la vue. – emk

+2

controller.action_name fonctionne aussi dans Rails 3.2 –

+2

Si vous voulez l'utiliser dans un 'before_filter' avec un bloc, faites' before_filter {| controller | ...} '. http://stackoverflow.com/questions/2669663/rails-before-filter-and-action-identification –

33

Dans le cas particulier d'une action Rails (par opposition au cas général d'obtenir le nom de la méthode actuelle), vous pouvez utiliser params[:action]

Sinon, vous voudrez peut-être regarder dans la personnalisation des Rails format de journal pour que l'action/nom de la méthode est inclus par le format plutôt que d'être dans votre message de journal.

+8

Vous étiez en mesure d'obtenir l'action en cours en appelant nom_action, je ne sais pas si cela fonctionne encore, mais je toujours pensé qu'il était un peu mieux que l'interrogation les params. – jonnii

+1

action_name fonctionne toujours et accepte que c'est un peu plus agréable :) – mikej

+0

Cela ne marche plus pour moi dans les rails 3. –

2

La réponse de mikej était très précise et utile, mais la chose que je voulais aussi savoir était comment obtenir le nom de la méthode actuelle dans les rails.

découvert qu'il est possible avec self.current_method

facilement trouvé à http://www.ruby-forum.com/topic/75258

-4

Je viens de faire la même chose. Je l'ai fait dans le contrôleur d'aide, mon code est:

def get_controller_name 
    controller_name  
end 


def get_action_name 
    action_name 
end 

Ces méthodes retourneront le contrôleur courant et le nom d'action. Hope it helps

+34

Confusion. Pourquoi encapsuler 'controller_name', qui est une méthode qui renvoie le nom du contrôleur actuel, dans une autre méthode qui appelle simplement' 'controller_name'? Pourquoi ne pas simplement appeler 'controller_name' et en finir avec? – piersadrian

6

Cet extrait fonctionne pour Rails 3

class ReportsController < ApplicationController 

    def summary 
    logger.debug self.class.to_s + "." + self.action_name 
    end 

end 

imprimera

. . .
ReportsController.summary
. . .

10

nom du contrôleur:

<%= controller.controller_name %> 

retour =>

nom d'action

'utilisateurs':

<%= controller.action_name %> 

retour => 'show'

id:

<%= ActionController::Routing::Routes.recognize_path(request.url)[:id] %> 

retour => « 23 »

Questions connexes