Rails - nome da ação do controlador para string

160

Eu tenho uma pergunta do Rails.

Como obtenho o nome de uma ação do controlador dentro da ação do controlador?

Por exemplo, em vez de

def create
  logger.info("create")
end

Eu quero escrever algo como

def create
  logger.info(this_def_name)
end

O que é uma maneira de obter this_def_name?

Pavel K.
fonte

Respostas:

337

Rails 2.X :@controller.action_name

Rails 3.1.X : controller.action_name,action_name

Rails 4.X :action_name

JellicleCat
fonte
5
Ou 'controller.action_name' no Rails 3.0. Essa é a melhor maneira de acessar o nome da ação na exibição.
EMK
2
Se você quiser usar isso em before_filterum bloco, faça before_filter { |controller| ... }. stackoverflow.com/questions/2669663/…
Benjamin Oakes
3
FYI, action_namefunciona no Rails 3.2.13 e controller.action_namenão.
Zach
rails 2.3.XX e @ controller.action_name não funciona, você deve usar apenas action_name para esta (s) versão (ões).
mkralla11
Existe uma versão de símbolo?
Bogdan Gusiev
34

No caso específico de uma ação do Rails (ao contrário do caso geral de obter o nome do método atual), você pode usar params[:action]

Como alternativa, você pode querer personalizar o formato de log do Rails para que o nome da ação / método seja incluído no formato, e não na sua mensagem de log.

mikej
fonte
8
Você costumava conseguir a ação atual chamando action_name, não tenho certeza se isso ainda funciona, mas sempre achei que era um pouco melhor do que consultar os parâmetros.
jonnii
Apenas para esclarecer, é "controller.action_name" ou "params [: action]", portanto, você pode fazer <% if controller.action_name == 'new'%> na exibição. Funciona para mim no Rails 3.2.
dmonopoly
1
Você também pode obter o nome do controlador via params [: Controlador]
Ash Azul
action_name == 'new'(unprefixed) ainda trabalha para mim no Rails 3.2
Brendon Muir
17

nome do controlador:

<%= controller.controller_name %>

return => 'usuários'

nome da ação:

<%= controller.action_name %>

return => 'mostrar'

Eu iria:

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

return => '23'

dumP
fonte
7

Esse snippet funciona para o Rails 3

class ReportsController < ApplicationController

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

end

irá imprimir

. . .
ReportsController.summary
. . .

Vladimir Kroz
fonte
3

A resposta de mikej foi muito precisa e útil, mas o que eu também queria saber era como obter o nome atual do método nos trilhos.

descobriu que é possível com self.current_method

facilmente encontrado em http://www.ruby-forum.com/topic/75258

Pavel K.
fonte
-4

Eu fiz o mesmo. Eu fiz isso no controlador auxiliar, meu código é:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

Esses métodos retornarão o contoller atual e o nome da ação. Espero que ajude

Rushabh Ajay Hathi
fonte
39
Confuso. Por que quebrar controller_name, que é um método que retorna o nome do controlador atual, em outro método que apenas chama controller_name ? Por que não ligar controller_namee terminar com isso?
Piersadrian