设计:从用户模型中获取和设置区域设置

时间:2012-10-19 19:26:49

标签: ruby-on-rails devise rails-admin

我在User表中为每个用户设置了区域设置。在用户登录后,我按照这些instructions来获取区域设置。它一直有效,直到用户重新加载浏览器,然后标准区域设置(en)再次变为活动状态。如何在会话中保留user.locale的值?我正在使用Rails_Admin,这意味着虽然我有一个User模型,但我没有User模型的控制器。

 # ApplicationController
 def after_sign_in_path_for(resource_or_scope)
  if resource_or_scope.is_a?(User) && resource_or_scope.locale !=  I18n.locale
    I18n.locale = resource_or_scope.locale
  end
  super
end 

3 个答案:

答案 0 :(得分:3)

管理将其保存在会话中,并在每次用户调用操作时从会话中检索它(ApplicationController中的before_filter):

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_locale # get locale from session when user reloads the page

  # get locale of user
  def after_sign_in_path_for(resource_or_scope)
    if resource_or_scope.is_a?(User) && resource_or_scope.locale.to_sym !=  I18n.locale
      I18n.locale = resource_or_scope.locale.to_sym # no strings accepted
      session[:locale] = I18n.locale      
    end        
    super
  end

  def set_locale
    I18n.locale = session[:locale]
  end
end

答案 1 :(得分:2)

虽然将它放在会话中是一个有效的答案,但您可以使用current_user方法获取用户的语言环境(并保持会话更清洁)

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_locale # get locale directly from the user model

  def set_locale
    I18n.locale = user_signed_in? ? current_user.locale.to_sym : I18n.default_locale
  end
end

答案 2 :(得分:1)

我在我的User模型中添加了一个名为user_locale的字符串列,然后将代码添加到应用程序控制器中。允许将存储,默认和区域设置用作参数。

迁移:

class AddLocaleToUser < ActiveRecord::Migration
 def change
   add_column :users, :user_locale, :string
 end
end 

application_controller.rb:

before_action :set_locale

private 

def set_locale
 valid_locales=['en','es']

 if !params[:locale].nil? && valid_locales.include?(params[:locale]) 
   I18n.locale=params[:locale]
   current_user.update_attribute(:user_locale,I18n.locale) if user_signed_in?
 elsif user_signed_in? && valid_locales.include?(current_user.user_locale)
   I18n.locale=current_user.user_locale
 else
  I18n.locale=I18n.default_locale
 end
end