为什么Rails只更新操作重定向到default_locale?

时间:2013-12-24 12:25:12

标签: ruby-on-rails ruby ruby-on-rails-3 internationalization rails-i18n

在我的多语言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

2 个答案:

答案 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