当authenticate_user时,Devise失去i18n.locale!踢进来

时间:2014-01-17 01:51:18

标签: ruby-on-rails ruby facebook oauth devise

我有一个多语言Rails 4.0.2 / Ruby 2.1.0应用程序。 Devise用于启用电子邮件/密码+ Facebook oAuth。 我页面上的翻译工作正常; 这更多是关于路由。

我遇到问题的功能流程:

  • 访客决定对某个项目进行投票(使用':locale / products /:uuid / vote'路径)
  • 访客必须通过身份验证(email / pwd或facebook oauth)
  • before_action :authenticate_user!, only: :vote
  • 身份验证启动和
  • 经过身份验证的访问者(=用户)被重定向到投票网址

目前最大的问题是Devise失去了当前的I18n.locale设置。 所以我不会去:locale / account / welcome我被重定向到account / welcome。 我试图用新的应用程序复制行为,果然, 我的问题突然出现了。

如何使用Devise将应用程序流保存在I18n.locale上下文中 它是auth / registration / redirects的默认流程吗?

class GalleryController < ApplicationController
    include ApplicationHelper
    skip_before_action :set_locale, only: :vote
    before_action :authenticate_user!, only: :vote

    def vote
        …
    end
end

来自ApplicationController的before_action:

class ApplicationController < ActionController::Base

    def set_locale
        # trying to set language with params[:locale]
        if MyApp.valid_locale?(params[:locale])
          I18n.locale = cookies.permanent[:locale] = params[:locale]
        else
          store_location
          redirect_to root_url unless :devise_controller?
        end
    end
end

2 个答案:

答案 0 :(得分:1)

尝试将此方法添加到ApplicationController

def self.default_url_options
  { locale: I18n.locale }
end

答案 1 :(得分:0)

尝试在会话中保存当前区域设置

# ApplicationController

before_action :set_locale

def set_locale
  I18n.locale = params[:locale] || session[:locale] || I18n.default_locale
  session[:locale] = I18n.locale
end

def default_url_options(options = {})
  { locale: I18n.locale }.merge options
end