在我的多语言Rails应用中,我有一个ProfilesController
。我正在使用GET变量section
将视图拆分为不同的选项卡。我也将该变量存储在session
中,以便在请求之间记住它。
class ProfilesController < ApplicationController
before_action :signed_in_user
before_action :find_profile
before_action :set_section, :only => [:show, :edit]
def show
end
def edit
end
def update
if @profile.update_attributes(profile_params)
flash[:success] = t('profiles.flash_messages.profile_updated')
redirect_to edit_profile_path(:section => session[:section])
else
@title = t("views.#{session[:section]}")
render :edit
end
end
private
def find_profile
@profile = current_user.profile
end
def set_section
section = Profile::SECTIONS.include?(params[:section]) ? params[:section] : Profile::SECTIONS[0]
session[:section] = section
end
我不明白为什么我的update
操作会不断重定向到default_locale
,而不是用户选择并因此存储在会话中的区域设置。
有人可以告诉我这里缺少什么吗?
这是我的routes.rb
文件的摘录:(请注意,我在这里使用单数资源,因为每个用户只能有一个个人资料)
MyApp::Application.routes.draw do
scope '(:locale)' do
resource :membership
...
get 'change_locale', :to => 'locales#change_locale'
end
end
更新
class ApplicationController < ActionController::Base
before_action :set_locale
protected
def set_locale
if params[:locale]
if I18n.available_locales.include?(params[:locale].to_sym)
I18n.locale = session[:locale] || params[:locale] || I18n.default_locale
end
end
end
def default_url_options
{ :locale => I18n.locale }
end
end
答案 0 :(得分:1)
尝试使用:
redirect_to edit_profile_path(:section => session[:section], :locale => I18n.locale)
或
class ApplicationController < ActionController::Base
before_action :set_locale
def default_url_options(options={})
{ locale: I18n.locale }
end
protected
def set_locale
I18n.locale = (session[:locale] || params[:locale]).to_s.downcase.presence || I18n.default_locale
end
end
这会有所帮助。
答案 1 :(得分:0)
我想你忘了设置default_url_options
:
# app/controllers/application_controller.rb
def default_url_options(options={})
{ :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) }
end