레일 4.1.11에서 4.1.16으로 업그레이드하려고합니다. 이 업그레이드 후에 내 SessionsController 사양 중 일부가 실패합니다. 하지만 개발 환경에서 로그인을 시도하면 모든 것이 잘 작동하는 것처럼 보입니다. 나는 OmniAuth 찾을 속성을 사용하려고하면ForbiddenAttributesError, 부 버전 업그레이드 후 테스트에만 있음
# spec_helper.rb
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({
:provider => 'facebook',
:uid => '1234567',
:info => {
:email => '[email protected]',
...
}
}
:
나는 다음과 같은 코드가 있습니다, 나는 OmniAuth 해시를 공급하는 spec_helper.rb
에 고정을 내 사양에서
# 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
를 사용 사용자의 신원을 묻는 메시지가 표시됩니다. 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'
I underst params
해시에 강력한 매개 변수 및 허용 목록 속성의 아이디어가 포함되어 있습니다. 하지만 OmniAuth 해시에는 require
을 사용할 수 없으며 (적어도 직접적으로는 해당되지 않음), 과거에는 할 필요가 없었습니다.
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
아마도,이 레일의 최신 버전에서 작동합니다
이
는 OmniAuth's GitHub page에서 제공하는 예이다.테스트를 통과하려면 어떻게해야합니까? 당신이보고 싶다면 Here 코드의 나머지 부분입니다.
@patrick 이것으로 어떤 진전이 있었습니까? – wicz
'ActionController :: Parameters.new (request.env [ "omniauth.auth"]). permit (: provider, : uid, : info)'를 시도했지만': info' 매개 변수는 포함하지 않았습니다 :'undefined 메소드 "info"for { "provider"=> "facebook", "uid"=> "1234567"} : ActionController :: ParametersActionController :: Parameters ...'. 어쨌든 이전에 통과 한 테스트가 작동하도록하려면 작업 코드를 수정하지 않는 것이 좋습니다. 앞서 언급했듯이 인증 해시를 검색하는 현재 방법은 설명서에 제공된 것과 동일하므로 문제가 컨트롤러 코드가 아닌 테스트 또는 레일스와 같아 보입니다. –
'info'에는 중첩 된 매개 변수가 있기 때문입니다. 'permit (: provider, : uid, info : [: email])'을 시도하십시오. 나는 그것이 작동 코드를 변경하지 않아도 좋을 것이라고 동의하지만, 환경이 바뀌었기 때문에 코드가 이에 맞게 수정되어야한다. OTOH, 그것은 더 나은 변화입니다. 그래서 그다지 신경 쓰지 않을 것입니다. 베스트! – wicz