Rails - nazwa akcji kontrolera na łańcuch


160

Mam pytanie dotyczące Railsów.

Jak uzyskać nazwę akcji kontrolera wewnątrz akcji kontrolera?

Na przykład zamiast

def create
  logger.info("create")
end

Chcę napisać coś takiego

def create
  logger.info(this_def_name)
end

Jaki jest sposób na zdobycie this_def_name?

Odpowiedzi:


337

Szyny 2.X :@controller.action_name

Szyny 3.1.x : controller.action_name,action_name

Szyny 4.X :action_name


5
Lub „controller.action_name” w Railsach 3.0. To najlepszy sposób na uzyskanie dostępu do nazwy akcji w widoku.
emk

2
Jeśli chcesz użyć tego w a before_filterz blokiem, zrób before_filter { |controller| ... }. stackoverflow.com/questions/2669663/…
Benjamin Oakes

3
FYI, action_namedziała w Railsach 3.2.13 i controller.action_namenie.
Zach

rails 2.3.XX i @ controller.action_name nie działają, musisz użyć tylko action_name dla tych wersji.
mkralla11

Czy istnieje wersja symbolu?
Bogdan Gusiev

34

W konkretnym przypadku akcji Railsów (w przeciwieństwie do ogólnego przypadku pobierania aktualnej nazwy metody) możesz użyć params[:action]

Alternatywnie możesz przyjrzeć się dostosowaniu formatu dziennika Railsów tak, aby nazwa akcji / metody była zawarta w formacie, a nie w komunikacie dziennika.


8
Kiedyś można było uzyskać bieżącą akcję, wywołując action_name, nie jestem pewien, czy to nadal działa, ale zawsze uważałem, że jest to trochę przyjemniejsze niż sprawdzanie parametrów.
jonnii

Dla wyjaśnienia, jest to „controller.action_name” lub „params [: action]”, więc możesz zrobić w widoku <% if controller.action_name == 'new'%>. U mnie działa w Railsach 3.2.
monopol

1
Nazwę kontrolera można również uzyskać poprzez parametr [: controller]
Ash Blue

action_name == 'new'(bez prefiksu) nadal działa dla mnie w Railsach 3.2
Brendon Muir

17

nazwa kontrolera:

<%= controller.controller_name %>

return => 'użytkownicy'

nazwa akcji:

<%= controller.action_name %>

return => 'pokaż'

ID:

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

return => „23”


7

Ten fragment działa dla Rails 3

class ReportsController < ApplicationController

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

end

wydrukuje

. . .
ReportsController.summary
. . .


3

Odpowiedź mikeja była bardzo dokładna i pomocna, ale chciałem też wiedzieć, jak uzyskać aktualną nazwę metody w railsach.

dowiedziałem się, że jest to możliwe dzięki self.current_method

łatwo znaleźć na http://www.ruby-forum.com/topic/75258


-4

Po prostu zrobiłem to samo. Zrobiłem to w kontrolerze pomocniczym, mój kod to:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

Te metody zwrócą bieżącą nazwę kontrolera i akcji. Mam nadzieję, że to pomoże


39
Mylące. Po co zawijać controller_name, czyli metodę zwracającą nazwę bieżącego kontrolera, inną metodą, która po prostu wywołuje controller_name ? Dlaczego po prostu nie zadzwonić controller_namei skończyć z tym?
piersadrian,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.