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?

Pavel K.
źródło

Odpowiedzi:

337

Szyny 2.X :@controller.action_name

Szyny 3.1.x : controller.action_name,action_name

Szyny 4.X :action_name

JellicleCat
źródło
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.

mikej
źródło
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”

wysypisko
źródło
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
. . .

Vladimir Kroz
źródło
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

Pavel K.
źródło
-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

Rushabh Ajay Hathi
źródło
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,