2011-06-29 59 views
4

在應用程序控制器中,我有幾個方法可以與請求的控制器和操作名稱一起工作。ApplicationController中帶參數值的類變量

要跟隨DRY principe,我想用這些參數定義共享變量。

class ApplicationController < ActionController::Base 
    @@requested_action  = params[:action] 
    @@requested_controller = params[:controller] 
end 

,但我得到的錯誤:undefined local variable or method "params" for ApplicationController:Class

我爲什麼不能做到這一點,我如何能實現我的目標是什麼?

回答

4

我相信你已經有通過的Rails爲此目的定義controller_nameaction_name變量。

如果您想按照自己的方式進行操作,則必須將其定義爲之前的過濾器,因爲參數只有在發出請求後纔會生效。你可以這樣做

class ApplicationController < ActionController::Base 
    before_filter :set_action_and_controller 

    def set_action_and_controller 
    @controller_name = params[:controller] 
    @action_name = params[:action] 
    end 
end 

你可以作爲@controller_name和@action_name訪問它們。但是在Rails中已經定義了controller_nameaction_name。你可以直接使用它們。

+0

酷!我不知道他們已經設置了什麼。謝謝! –

+0

謝謝你。使用Rails 4.2.1進行測試,在ApplicationController中但在before_filter之外,controller_name是「application」; action_name和params不存在。在before_filter中,controller_name對應於正在加載的控制器,另外兩個也被設置。因此,直到提出請求才會出現有關參數的評論仍然有效。 –

2

使用實例方法代替:

class ApplicationController < ActionController::Base 
    def requested_action 
    params[:action] if params 
    end 
end 
2

可以使用的before_filter選項。

class ApplicationController < ActionController::Base 
    before_filter :set_share_variable 

    protected 

    def set_share_variable 
    @requested_action  = params[:action] 
    @requested_controller = params[:controller] 
    end 
end