Rails - имя действия контроллера в строку


160

У меня есть вопрос по Rails.

Как получить имя действия контроллера внутри действия контроллера?

Например, вместо

def create
  logger.info("create")
end

Я хочу написать что-то вроде

def create
  logger.info(this_def_name)
end

Какой способ получить this_def_name?

Ответы:


337

Rails 2.X :@controller.action_name

Рельсы 3.1.x : controller.action_name,action_name

Rails 4.X :action_name


5
Или 'controller.action_name' в Rails 3.0. Это лучший способ получить доступ к имени действия в представлении.
Emk

2
Если вы хотите использовать это в before_filterблоке, сделайте before_filter { |controller| ... }. stackoverflow.com/questions/2669663/…
Бенджамин Оукс

3
К вашему сведению, action_nameработает в Rails 3.2.13 и controller.action_nameне работает.
Зак

rails 2.3.XX и @ controller.action_name не работают, вы должны использовать только action_name для этой версии (версий).
mkralla11

Есть версия символа?
Богдан Гусиев

34

В конкретном случае действия Rails (в отличие от общего случая получения текущего имени метода) вы можете использовать params[:action]

В качестве альтернативы вы можете захотеть настроить формат журнала Rails таким образом, чтобы имя действия / метода включалось в формат, а не в ваше сообщение журнала.


8
Раньше вы могли получить текущее действие, вызывая action_name, я не уверен, что это все еще работает, но я всегда думал, что это немного лучше, чем запрашивать параметры.
Джонни

Просто чтобы уточнить, это "controller.action_name" или "params [: action]", так что вы можете сделать <% if controller.action_name == 'new'%> в представлении. Это работает для меня в Rails 3.2.
dmonopoly

1
Вы также можете получить имя контроллера через params [: controller]
Ash Blue

action_name == 'new'(без префикса) все еще работает для меня в Rails 3.2
Брендон Мьюр

17

имя контроллера:

<%= controller.controller_name %>

return => 'пользователи'

Название действия:

<%= controller.action_name %>

возврат => «показать»

мне бы:

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

return => '23'


7

Этот фрагмент работает для Rails 3

class ReportsController < ApplicationController

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

end

распечатает

, , ,
ReportsController.summary
. , ,


3

Ответ mikej был очень точным и полезным, но я также хотел узнать, как получить имя текущего метода в рельсах.

узнал, что это возможно с self.current_method

легко найти на http://www.ruby-forum.com/topic/75258


-4

Я просто сделал то же самое. Я сделал это в вспомогательном контроллере, мой код:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

Эти методы будут возвращать текущий контроллер и имя действия. Надеюсь, поможет


39
Смешение. Зачем переносить controller_name, который является методом, который возвращает имя текущего контроллера, в другой метод, который просто вызывает controller_name ? Почему бы просто не позвонить controller_nameи не покончить с этим?
piersadrian
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.