Rotaie: nome dell'azione del controller su stringa


160

Ho una domanda su Rails.

Come posso ottenere il nome di un'azione del controller all'interno dell'azione del controller?

Ad esempio, invece di

def create
  logger.info("create")
end

Voglio scrivere qualcosa del genere

def create
  logger.info(this_def_name)
end

Qual è un modo per ottenere this_def_name?

Risposte:


337

Rotaie 2.X :@controller.action_name

Rails 3.1.x : controller.action_name,action_name

Rotaie 4.X :action_name


5
O 'controller.action_name' in Rails 3.0. Questo è il modo migliore per accedere al nome dell'azione nella vista.
emk,

2
Se vuoi usarlo in a before_filtercon un blocco, fallo before_filter { |controller| ... }. stackoverflow.com/questions/2669663/...
Benjamin Oakes,

3
Cordiali saluti, action_namefunziona in Rails 3.2.13 e controller.action_namenon lo fa.
Zach,

rails 2.3.XX e @ controller.action_name non funzionano, devi usare solo action_name per questa versione.
mkralla11,

Esiste una versione di simboli?
Bogdan Gusiev,

34

Nel caso specifico di un'azione di Rails (al contrario del caso generale di ottenere il nome del metodo corrente) è possibile utilizzare params[:action]

In alternativa, è possibile esaminare la personalizzazione del formato del registro di Rails in modo che il nome dell'azione / del metodo sia incluso nel formato anziché nel messaggio di registro.


8
Una volta riuscivi a ottenere l'azione corrente chiamando action_name, non sono sicuro che funzioni ancora, ma ho sempre pensato che fosse un po 'più bello che interrogare i parametri.
jonnii,

Per chiarire, è "controller.action_name" o "params [: action]", quindi potresti fare <% se controller.action_name == 'new'%> nella vista. Funziona per me in Rails 3.2.
Dmonopoli

1
Puoi anche ottenere il nome del controller tramite params [: controller]
Ash Blue

action_name == 'new'(non risolto) funziona ancora per me in Rails 3.2
Brendon Muir

17

nome del controller:

<%= controller.controller_name %>

return => 'utenti'

nome dell'azione:

<%= controller.action_name %>

return => 'mostra'

id:

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

return => '23'


7

Questo frammento funziona per Rails 3

class ReportsController < ApplicationController

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

end

stamperà

. . .
ReportsController.summary
. . .


3

La risposta di Mikej è stata molto precisa e utile, ma la cosa che volevo anche sapere era come ottenere il nome del metodo corrente nelle rotaie.

scoperto che è possibile con self.current_method

facilmente reperibile su http://www.ruby-forum.com/topic/75258


-4

Ho fatto lo stesso. L'ho fatto in helper controller, il mio codice è:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

Questi metodi restituiranno il controller e il nome dell'azione correnti. Spero che sia d'aiuto


39
Confondere. Perché avvolgere controller_name, che è un metodo che restituisce il nome del controller corrente, in un altro metodo che chiama controller_name ? Perché non chiamare controller_namee finirlo?
piersadrian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.