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?

Respostas:


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


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'


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


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


-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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.