2012-09-19 83 views
2

我剛剛進入Rails,並且我在理解某些語法元素時遇到了一些麻煩,我正在閱讀的這些指南似乎理所當然。Rails - 重構控制器方法到應用程序控制器

今天下午我正在研究一個小樣本項目,並試圖重構一些代碼。基本上,我想在我的導航欄中包含僅限管理員控件的鏈接,這些控件取決於當前正在查看的頁面。這是我的原始代碼:

class RoomsController < ApplicationController 
    before_filter :admin_controlls 

    def new 
    end 

    def create 
    end 

    def edit 
    end 

    def update 
    end 

    def index 
    end 

    def destroy 
    end 

    private 
    def admin_controlls 
     @adminControlls = "rooms" 
    end 
end 

我的想法是,這個代碼本質上是相同的每個控制器,我想創建管理控制。唯一的區別是我想傳遞給View的標誌變量@adminControlls的值。

於是,我嘗試這樣的:

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    include SessionsHelper 

    def admin_controlls(page) 
     @adminControlls = page 
    end 
end 

,改變了房間控制器這樣的:

class RoomsController < ApplicationController 
    before_filter admin_controlls "rooms" 

    def new 
    end 

    def create 
    end 

    def edit 
    end 

    def update 
    end 

    def index 
    end 

    def destroy 
    end 

end 

我覺得我的困惑與before_filter,來開始,爲什麼叫有一個方法需要一個符號。我不知道如何將字符串作爲符號調用時將字符串傳遞給方法,並且我所有改變之前的過濾器以調用方法(如上所述)的努力都失敗了。總的來說,我只是不覺得我正在掌握語法的一些微妙之處。如果任何人有一個會有所幫助的資源,我會很感激。

+0

你看過'params [:controller]'嗎? –

回答

1

你可以試試這個:before_filter { |c| c.admin_controlls "rooms" }?類似的問題可以在這裏找到:How can I send a parameter to a before filter?

+0

這確實有用。同樣簡單的before_filter {admin_controlls「rooms」}或before_filter做admin_controlls「房間」結束 如果有人能解釋爲什麼這個塊語法是必要的,我一定會喜歡。我真的很難理解語法。我覺得我更像記住一個「做這個,不是那個」的列表,而是理解爲什麼需要某些東西。 –

+0

你會習慣它的。它是學習新語言/框架的重要組成部分。它有助於查看源代碼:https://github.com/rails/rails/blob/master/actionpack/lib/abstract_controller/callbacks.rb。你會發現它需要一個塊作爲第二個參數。該文檔可能會提供更好的洞察力:http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-_insert_callbacks –

0

爲什麼它需要一個符號的原因是要「的before_filter」第一次加載控制器類時被運行的呼叫......但你要實際的before_filter 方法( admin_controlls)在每一個動作(不只是一次)上被調用。

因此,加載時間before_filter調用存儲稍後調用的方法的名稱...每次運行控制器操作時。