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?

Réponses:


337

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 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.


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'


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
. . .


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


-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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.