2012-05-29 27 views
2

我試圖根據每個請求的URL中傳遞的GET參數更改我的應用程序的佈局:&layout=name_of_the_layout覆蓋rails輔助路由方法來設置GET參數的佈局

在我application_controller:

class ApplicationController < ActionController::Base 
    layout :get_layout_from_params 

    private 
    def get_layout_from_params 
    if params['layout'] 
     params['layout'] 
    else 
     'application' 
    end 
    end 
end 

它工作正常,但是當用戶在應用程序導航「堅持」的佈局,我需要在我的意見加上每個軌道路線助手此參數(即使在表單POST請求...):

ressource_path(@ressource, :layout => get_layout_from_url()) 

其中get_layout_from_url()是,如果params['layout']在URL設置,檢查一個幫手,驗證然後返回。

這絕對不是DRY ...我怎麼能重寫每個路由幫助包括這種行爲,而不寫我的意見中的任何額外的代碼?我想在我的意見中稱爲標準導軌方法:ressource_path(@ressource), ...

或者是否有更聰明的方法來實現?

PS:使用導軌的Im 3.2.3

謝謝!

回答

2

有舊的和過時default_url_options現在url_options取代:

class ApplicationController < ActionController::Base 
    def url_options 
    { :layout => validate_layout }.merge(super) 
    end 

    def validate_layout 
    # some stuff reusable 
    params[:layout] 
    end 
end 

如果它不適合,它是接近。

+0

正是我在尋找的感謝! – Tricote

2

我認爲你最好將它存儲在會話中,而不是將它附加到每個請求的url。

在軌,你可以在一個非常簡單的方法使用會話:

def get_layout_from_params 
    if params['layout'] 
    session['layout'] = params['layout'] 
    else 
    session['layout'] || 'application' 
    end 
end 

如果有params['layout'],這意味着用戶要改變佈局,所以你把它分配給會話。

如果沒有給出params['layout'],則檢查是否存在session['layout'],如果session ['layout']爲false或nil,則返回或返回'application'

---編輯---

以下版本更短,看你喜歡還是不喜歡:

def get_layout_from_params 
    session['layout'] = params['layout'] || session['layout'] || 'application' 
end 
+0

嗨,感謝您的回答,這絕對是一種乾淨的方式來管理這一點,但我真的需要在每個請求的URL中傳遞佈局參數,因爲用戶可以在同一會話期間訪問這兩個佈局... – Tricote