rails4设计omniauth如何动态修改其中一个策略选项?

时间:2014-08-14 23:06:11

标签: ruby-on-rails-4 devise omniauth

我正在使用Devise + Omniauth,我定义了自己的门卫策略来添加语言选项

在config / initializers / devise.rb中,我设置了:

require 'omniauth/strategies/doorkeeper'
config.omniauth :doorkeeper,  Rails.application.secrets.doorkeeper_app_id, Rails.application.secrets.doorkeeper_app_secret, 
   :client_options =>  {
   :site => Rails.application.secrets.doorkeeper_url
},
:authorize_params =>{:lang => I18n.locale}

最初将lang设置为:en(默认语言环境)

这很好用,并将lang选项发送到远程服务器进行门卫处理

现在,如何在客户端呼叫控制器中更改此参数? 我试着用:

  def index
      I18n.locale = :fr    
      Rails.application.config.middleware.use OmniAuth::Builder do
           provider :doorkeeper, :setup => lambda{|env| env['omniauth.strategy'].options[:authorize_params][:lang] = env['rack.session'][I18n.locale] }
  end

但是我收到了一个错误:

 RuntimeError (can't modify frozen Array):
 app/controllers/home_controller.rb:7:in `index'

有没有更好的方法呢?谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

我修改了config / initializers / devise.rb,添加:setup =>真

  require 'omniauth/strategies/doorkeeper'
  config.omniauth :doorkeeper,  Rails.application.secrets.doorkeeper_app_id, Rails.application.secrets.doorkeeper_app_secret, 
   :client_options =>  {
        :site => Rails.application.secrets.doorkeeper_url
   },
  :authorize_params =>{:lang => I18n.locale},
   :setup => true

我修改了我的门卫策略,包括setup_phase,我在其中将lang选项设置为当前语言环境。

    def setup_phase
        request.env['omniauth.strategy'].options[:authorize_params][:lang] =  request.params["locale"]
    end