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

JellicleCat
источник
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 таким образом, чтобы имя действия / метода включалось в формат, а не в ваше сообщение журнала.

MikeJ
источник
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