2016-03-14 53 views
2
當前頁面

我已經得到了下面的Rails代碼:Rails的變化區域回到

我嘗試設置我的應用程序的語言與此

def changelocale 
if Settings.language_supported?(params[:locale]) 
    session[:locale] = params[:locale] 
    I18n.locale = params[:locale] 
end 
render "startsite" 
end 

什麼,我想的是,語言切換會影響當前頁面。渲染「startsite」是個問題,但是這樣做可能是一個很好的解決方案?

感謝

+0

你可能想要做一個'redirect_to的:back',但也許測試之前的'request.referer'的路由匹配你的應用。如果不是,重定向到'root_path'而不是 – MrYoshiji

回答

3

你需要的是這些內容摘要:

class ApplicationController < ActionController::Base 
    before_action :set_locale 

    def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
    end 

    def default_url_options(options = {}) 
    { locale: I18n.locale }.merge options 
    end 
end 

第一種方法切換區域設置方法,第二個總是附加的區域設置參數去請求。

編輯發表評論:

# config/routes.rb 
scope "/:locale" do 
    resources :books 
end 

從軌DOC:http://guides.rubyonrails.org/i18n.html

+0

然後我如何使用它?假設我在我看來:'%= link_to「nl」,request.fullpath%>',其中請求完整路徑是「/ fr/boo/bar」。如何用「nl」替換url中的「fr」? – thiebo

+0

我會更新答案.... –

0

您將在I18n Guide看到,你可以就此局部視圖允許您通過添加一個products/show.de.erbproducts/show.en-uk.erb

我希望changelocal保持這種「startsite」不是動作但是before_filter?過濾器是設置語言環境最優雅的解決方案,並且可以減輕您對重定向的任何需求。

+0

你能告訴我一個帶有過濾器的例子嗎? – Felix

+0

我不認爲'before_filter'在這裏是一個解決方案,因爲@Felix想要一個動作來改變當前的語言環境。 'before_filter'應該將'I18n.locale'設置爲'session [:locale]',而不是設置'session [:locale]' – MrYoshiji

0

你可以重定向到前一頁或root_path如果前面的頁面不存在:

def changelocale 
    if Settings.language_supported?(params[:locale]) 
    session[:locale] = params[:locale] 
    I18n.locale = params[:locale] 
    end 
    redirect_to request.referer.presence || root_path 
end 

但是這種重定向可能會導致404找不到:如果你去一些顯示頁面,然後點擊刪除按鈕,現在request.referer指向一個不存在記錄的顯示頁面。它必須小心使用。

0

如果語言環境是您網址的一部分(看起來是這樣),您只需更改視圖中的鏈接即可切換到另一個版本的頁面。

例如,如果您當前的路徑是/en/about,你可以採取request.fullpath,並要鏈接到現場更換當前的區域鏈接到/de/about/fr/about

這樣你就不需要任何過濾器或重定向。