2009-08-07 18 views
127

Tengo una pregunta de Rails.Rieles: nombre de la acción del controlador en la cadena

¿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 así como

def create 
    logger.info(this_def_name) 
end 

¿Cuál es una manera de conseguir this_def_name?

Respuesta

287

rieles 2.X: @controller.action_name

rieles 3.1.X: controller.action_name, action_name

Rails 4.X: action_name

+5

O' controller.action_name 'en Rails 3.0. Esta es la mejor forma de acceder al nombre de la acción en la vista. – emk

+2

controller.action_name funciona en Rails 3.2 también –

+2

Si desea utilizar esto en un 'before_filter' con un bloque, haga' before_filter {| controller | ...} '. http://stackoverflow.com/questions/2669663/rails-forefore-filter-and-action-identification –

33

En el caso específico de una acción de rieles (en contraposición al caso general de conseguir el nombre del método actual) se puede utilizar params[:action]

Alternativamente es posible que desee ver en la personalización de los rieles formato de registro para que la acción/El nombre del método está incluido en el formato en lugar de estar en su mensaje de registro.

+8

Usted solía ser capaz de obtener la acción actual llamando ACTION_NAME, no estoy seguro si es que todavía funciona, pero siempre pensé que era un poco mejor que la consulta los params. – jonnii

+1

action_name todavía funciona y estoy de acuerdo que es un poco mejor :) – mikej

+0

Esto ya no funciona para mí en rails 3. –

2

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.

descubrió que es posible con self.current_method

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

-4

Acabo de hacer lo mismo. Lo hice en el controlador ayudante, mi código es:

def get_controller_name 
    controller_name  
end 


def get_action_name 
    action_name 
end 

Estos métodos volverán controlador de corriente y el nombre de la acción. Espero que ayuda

+34

confuso. ¿Por qué ajustar '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_name' y terminar con eso? – piersadrian

6

funciona Este fragmento de Rails 3

class ReportsController < ApplicationController 

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

end 

imprimirá

. . .
ReportsController.summary
. . .

10

nombre del controlador:

<%= controller.controller_name %> 

retorno => nombre de

acción 'usuarios':

<%= controller.action_name %> 

retorno => 'show'

Identificación:

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

de retorno => '23'

Cuestiones relacionadas