2009-08-07 23 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」

相關問題