Rails更改区域设置返回当前页面

时间:2016-03-14 20:14:03

标签: ruby-on-rails ruby ruby-on-rails-4

我有以下导轨代码:

我尝试使用此

设置应用程序的语言
 def changelocale
if Settings.language_supported?(params[:locale])
  session[:locale] = params[:locale]
  I18n.locale = params[:locale]
end
render "startsite"
 end

我想要的是语言切换会影响当前页面。渲染" startsite"是问题,但这可能是一个很好的解决方案吗?

感谢

4 个答案:

答案 0 :(得分:4)

你需要的是这些片段:

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

来自rails doc:http://guides.rubyonrails.org/i18n.html

答案 1 :(得分:0)

您会在I18n Guide中看到您可以拥有本地化视图,从而可以通过添加products/show.de.erbproducts/show.en-uk.erb等来保持“起始地点”。

我希望changelocal不是行动,而是before_filter?过滤器是设置区域设置的最佳解决方案,可以减轻您重定向的需要。

答案 2 :(得分: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指向一个不存在的记录的节目页面。必须谨慎使用。

答案 3 :(得分:0)

如果区域设置是您网址的一部分(看起来像是这样),您只需更改视图中的链接即可切换到另一个版本的网页。

例如,如果您当前的路径为/en/about,则可以通过/de/about并使用您想要的区域设置替换当前区域设置来链接到/fr/aboutrequest.fullpath链接到。

这样您就不需要任何过滤器或重定向。