-1

アプリケーション コントローラで before_action/before_filter を使用せずにロケールを設定し、リクエスト間で設定を維持する方法はありますか?

私は現在の解決策を避けようとしています:

class ApplicationController < ActionController::Base
  before_action :set_locale

  def set_locale
    I18n.locale = current_user.locale if current_user
  end  
end

class LocaleController < ApplicationController
  skip_authorization_check

  def index
    locale = params[:locale]
    raise 'Unsupported locale' unless ['en', 'pt'].include?(locale)
    error_message = "Could not set locale" unless current_user.update_column(:locale, locale)
    I18n.locale = current_user.locale if error_message.nil?
    redirect_to :back, :alert => error_message
  end
end
4

1 に答える 1

1

のみを使用する必要があります

class ApplicationController < ActionController::Base

  catrr_accesor :locale_set
  before_action :set_locale :if => lambda {|c| locale_set}


  def set_locale
    I18n.locale = current_user.locale if current_user
    ApplicationController.locale_set = true
  end  
end

コードからわかるように、他のコントローラーはそれを継承しています。

そして、おそらくあなたは次のようなことをしたいでしょう:

  def set_locale
    I18n.locale = user_signed_in? ? current_user.locale.to_sym : (params[:local] || I18n.default_locale)
  end

デバイスでスイングするには、次のようなもので終了できます。

  # get locale of user
  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.to_sym || I18n.default_locale
    end
    session[:previous_url] || root_path
  end
于 2013-10-03T14:47:51.887 に答える