Rieles: nombre de acción del controlador a cadena

160

Tengo una pregunta sobre Rails.

¿Cómo obtengo el nombre de una acción del controlador dentro de la acción del controlador?

Por ejemplo, en lugar de

def create
  logger.info("create")
end

Quiero escribir algo como

def create
  logger.info(this_def_name)
end

¿Qué es una forma de llegar this_def_name?

Pavel K.
fuente

Respuestas:

337

Carriles 2.X :@controller.action_name

Carriles 3.1.X : controller.action_name,action_name

Carriles 4.X :action_name

JellicleCat
fuente
55
O 'controller.action_name' en Rails 3.0. Esta es la mejor manera de acceder al nombre de la acción en la vista.
emk 01 de
2
Si quieres usar esto en un before_filtercon un bloque, hazlo before_filter { |controller| ... }. stackoverflow.com/questions/2669663/…
Benjamin Oakes
3
Para su información, action_namefunciona en Rails 3.2.13, y controller.action_nameno lo hace.
Zach
rails 2.3.XX y @ controller.action_name no funciona, debe usar solo action_name para esta (s) versión (es).
mkralla11
¿Hay una versión de símbolo?
Bogdan Gusiev
34

En el caso específico de una acción Rails (en oposición al caso general de obtener el nombre del método actual) puede usar params[:action]

Alternativamente, es posible que desee considerar la personalización del formato de registro de Rails para que el nombre de la acción / método esté incluido en el formato en lugar de estar en su mensaje de registro.

mikej
fuente
8
Solía ​​poder obtener la acción actual llamando a action_name, no estoy seguro de si eso todavía funciona, pero siempre pensé que era un poco mejor que consultar los parámetros.
jonnii
Solo para aclarar, es "controller.action_name" o "params [: action]", por lo que puede hacer <% if controller.action_name == 'new'%> en la vista. A mí me funciona en Rails 3.2.
dmonopolio
1
También puede obtener el nombre del controlador a través de parámetros [: controlador]
Ash Blue
action_name == 'new'(sin prefijar) todavía funciona para mí en Rails 3.2
Brendon Muir el
17

nombre del controlador:

<%= controller.controller_name %>

return => 'usuarios'

nombre de acción:

<%= controller.action_name %>

return => 'mostrar'

carné de identidad:

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

return => '23'

tugurio
fuente
7

Este fragmento funciona para Rails 3

class ReportsController < ApplicationController

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

end

imprimirá

. . .
ReportsController.summary
. . .

Vladimir Kroz
fuente
3

La respuesta de mikej fue muy precisa y útil, pero lo que también quería saber era cómo obtener el nombre del método actual en los rieles.

descubrí que es posible con self.current_method

se encuentra fácilmente en http://www.ruby-forum.com/topic/75258

Pavel K.
fuente
-4

Yo solo hice lo mismo. Lo hice en el controlador auxiliar, mi código es:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

Estos métodos devolverán el controlador actual y el nombre de la acción. Espero eso ayude

Rushabh Ajay Hathi
fuente
39
Confuso. ¿Por qué wrap controller_name, que es un método que devuelve el nombre del controlador actual, en otro método que solo llama controller_name ? ¿Por qué no simplemente llamar controller_namey terminar?
piersadrian el