我正在尝试从Rails 4.1.11升级到4.1.16。升级后,我的几个SessionsController规范都失败了。但是当我尝试登录开发环境时,一切似乎都能正常工作。
我有以下代码:
# sessions_controller.rb
def create
@identity = Identity.find_or_create(auth)
...
end
protected
def auth
request.env["omniauth.auth"]
end
# identity.rb
class Identity < ActiveRecord::Base
...
def self.find_or_create(auth)
where(auth.slice(:uid, :provider)).first_or_create
end
end
在我的规范中,我使用spec_helper.rb
中的一个fixture来提供OmniAuth哈希:
# spec_helper.rb
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({
:provider => 'facebook',
:uid => '1234567',
:info => {
:email => 'joe@bloggs.com',
...
}
}
当我尝试使用OmniAuth属性查找用户的身份时,我得到ForbiddenAttributesError
:
1) SessionsController GET :create not yet signed in sets the user ID in the session hash
Failure/Error: get :create
ActiveModel::ForbiddenAttributesError:
ActiveModel::ForbiddenAttributesError
# /Users/pat/.rvm/gems/ruby-2.1.2/gems/activemodel-4.1.6/lib/active_model/forbidden_attributes_protection.rb:21:in `sanitize_for_mass_assignment'
我理解params
哈希中强参数和白名单属性的概念。但是我不能在OmniAuth哈希上使用require
(至少不能直接使用),而我过去也没有。
这是OmniAuth's GitHub page上提供的示例:
class SessionsController < ApplicationController
def create
@user = User.find_or_create_from_auth_hash(auth_hash)
self.current_user = @user
redirect_to '/'
end
protected
def auth_hash
request.env['omniauth.auth']
end
end
据推测,它适用于最新版本的Rails。
如何让我的测试通过?如果你想看看,Here是代码的其余部分。
答案 0 :(得分:5)
您是否尝试过像这样的参数列入白名单?
def auth
ActionController::Parameters.new(request.env["omniauth.auth"]).permit(...)
end
答案 1 :(得分:0)
尝试将gemfile中的rspec版本更改为:
gem "rspec-rails", '~> 2.14.0.rc1'