Rails - nom de l'action du contrôleur en chaîne

160

J'ai une question Rails.

Comment puis-je obtenir le nom d'une action de contrôleur dans l'action de 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

Quel est le moyen d’obtenir this_def_name?

Pavel K.
la source

Réponses:

337

Rails 2.X :@controller.action_name

Rails 3.1.x : controller.action_name,action_name

Rails 4.X :action_name

JellicleCat
la source
5
Ou 'controller.action_name' dans Rails 3.0. C'est la meilleure façon d'accéder au nom de l'action dans la vue.
emk
2
Si vous souhaitez utiliser ceci dans un before_filteravec un bloc, faites before_filter { |controller| ... }. stackoverflow.com/questions/2669663/…
Benjamin Oakes
3
FYI, action_namefonctionne dans Rails 3.2.13, et controller.action_namene le fait pas.
Zach
rails 2.3.XX et @ controller.action_name ne fonctionnent pas, vous devez utiliser uniquement action_name pour cette (ces) version (s).
mkralla11
Existe-t-il une version symbolique?
Bogdan Gusiev
34

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

Vous pouvez également envisager de personnaliser le format du journal Rails afin que le nom de l'action / méthode soit inclus par le format plutôt que dans votre message de journal.

Mikej
la source
8
Vous aviez l'habitude de pouvoir obtenir l'action actuelle en appelant action_name, je ne suis pas sûr que cela fonctionne toujours, mais j'ai toujours pensé que c'était un peu plus agréable que d'interroger les paramètres.
jonnii
Juste pour clarifier, c'est "controller.action_name" ou "params [: action]", donc vous pouvez faire <% if controller.action_name == 'new'%> dans la vue. Cela fonctionne pour moi dans Rails 3.2.
dmonopoly
1
Vous pouvez également obtenir le nom du contrôleur via les paramètres [: controller]
Ash Blue
action_name == 'new'(sans préfixe) fonctionne toujours pour moi dans Rails 3.2
Brendon Muir
17

nom du contrôleur:

<%= controller.controller_name %>

return => 'utilisateurs'

nom de l'action:

<%= controller.action_name %>

return => 'afficher'

identifiant:

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

return => '23'

déverser
la source
7

Cet extrait fonctionne pour Rails 3

class ReportsController < ApplicationController

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

end

va imprimer

. . .
ReportsController.summary
. . .

Vladimir Kroz
la source
3

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 que c'est possible avec self.current_method

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

Pavel K.
la source
-4

J'ai juste fait la même chose. Je l'ai fait dans le contrôleur d'assistance, mon code est:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

Ces méthodes renverront le contrôleur actuel et le nom de l'action. J'espère que ça aide

Rushabh Ajay Hathi
la source
39
Déroutant. Pourquoi wrap controller_name, qui est une méthode qui retourne le nom du contrôleur actuel, dans une autre méthode qui appelle simplement controller_name? Pourquoi ne pas simplement appeler controller_nameet en finir?
piersadrian