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?

Respuestas:


337

Carriles 2.X :@controller.action_name

Carriles 3.1.X : controller.action_name,action_name

Carriles 4.X :action_name


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.


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'


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


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


-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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.