2016-02-15 64 views
2

我按照以下方式在我的路線中重定向鏈接。Rails路線在重定向中內插可選參數

match '(:locale)/products', to: redirect('%{locale}/products/new', status: 301), via: 'get' 

這裏參數:locale是可選的。

所以,如果當PARAM :locale是空的時,收到錯誤消息:

key{locale} not found 

一種可能的解決方法是在重定向時使用塊代替,哪裏可以例如添加自定義邏輯

match '(:locale)/products', to: redirect{ |params|"#{params[:locale]}/products/new"}, status: 301, via: 'get' 

但是有沒有什麼辦法可以在不使用塊的情況下以更短的形式插入可選參數?

回答

3

我試着用我的模型用戶。 它看起來像

Rails.application.routes.draw do 
    resources :users 
    get '(:locale)/users' => redirect('/users?locale=%{locale}', :status => 301) 
    # get '(:locale)/users' => redirect { | params | "/users?locale=#{params[:locale]}" }, :status => 301, :constraints => { :locale => /[a-z]{2,2}/i } 
    root 'welcome#index' 
end 

首先,我沒有得到一個錯誤,當:現場失蹤是因爲「資源」之前和第二,你可以設置一個約束,以確保該參數是存在的。

對此有幫助嗎?

UPDATE

get '(:locale)/users' => redirect('/users?locale=%{locale}', :status => 301), :defaults => { :locale => "de" } 

還有設置默認值的可能性。

+0

不,它不。如果我設置了約束,那麼簡單的路由將不會匹配,並且顯然不會產生錯誤。這樣,我將不得不做2條路線,其中一條用於缺少語言環境,另一條用於提供。這樣,我們根本不會利用可選參數。 –

+0

對。 ':defaults'解決了這個問題。如果我們根本不需要設置區域設置,它也可以設置爲'{:locale =>「」}'。公認。謝謝。 –