2009-08-07 57 views
127

我有一个Rails问题。Rails - 控制器对字符串的动作名称

如何在控制器操作中获取控制器操作的名称?

例如,而不是

def create 
    logger.info("create") 
end 

我想写类似

def create 
    logger.info(this_def_name) 
end 

有什么办法让this_def_name

回答

287

Rails的2.X容易被发现:@controller.action_name

Rails的3.1.Xcontroller.action_nameaction_name

Rails 4.Xaction_name

+5

或Rails 3.0中的'controller.action_name'。这是在视图中访问操作名称的最佳方式。 – emk 2011-02-01 19:59:59

+2

controller.action_name在Rails 3.2中也可以使用 – 2012-02-15 03:22:14

+2

如果你想在一个带有块的'before_filter'中使用它,可以执行'before_filter {| controller | ''。 http://stackoverflow.com/questions/2669663/rails-before-filter-and-action-identification – 2013-02-05 17:43:36

33

在Rails动作的特定情况下(而不是获取当前方法的名称一般情况下),可以使用params[:action]

或者你可能要考虑定制Rails日志格式,以便在行动/方法名称包含在格式中,而不是它在您的日志消息中。

+8

你以前可以通过调用ACTION_NAME获得当前的行动,我不知道,如果目前仍然可以工作,但我一直以为这是不是查询更好一点这些参数。 – jonnii 2009-08-07 14:46:18

+1

action_name仍然有效,并认为它有点更好:) – mikej 2009-08-07 15:27:17

+0

这对我在rails 3中不起作用了。 – 2011-05-31 05:36:14

2

mikej的回答非常精确和有帮助,但我也想知道的是如何在rails中获取当前方法名称。

发现它可能与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 

这些方法将返回当前的控制器和操作名称。希望它可以帮助

+34

令人困惑。为什么在另一个只调用*'controller_name'的方法中封装'controller_name',它是一个返回当前控制器名称的方法?为什么不直接调用'controller_name'并完成它呢? – piersadrian 2012-07-21 23:32:47

6

这个片段的作品为Rails 3

class ReportsController < ApplicationController 

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

end 

将打印

。 。 。
ReportsController.summary
。 。 。

10

控制器名称:

<%= controller.controller_name %> 

回报=> '用户'

动作名称:

<%= controller.action_name %> 

返回> '节目'

ID:

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

收益率=>“23”