2014-09-22 2 views
1

레일 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 코드의 나머지 부분입니다.

답변

4

는이 같은 매개 변수를 허용 목록에 시도?

def auth 
    ActionController::Parameters.new(request.env["omniauth.auth"]).permit(...) 
end 
+0

@patrick 이것으로 어떤 진전이 있었습니까? – wicz

+0

'ActionController :: Parameters.new (request.env [ "omniauth.auth"]). permit (: provider, : uid, : info)'를 시도했지만': info' 매개 변수는 포함하지 않았습니다 :'undefined 메소드 "info"for { "provider"=> "facebook", "uid"=> "1234567"} : ActionController :: ParametersActionController :: Parameters ...'. 어쨌든 이전에 통과 한 테스트가 작동하도록하려면 작업 코드를 수정하지 않는 것이 좋습니다. 앞서 언급했듯이 인증 해시를 검색하는 현재 방법은 설명서에 제공된 것과 동일하므로 문제가 컨트롤러 코드가 아닌 테스트 또는 레일스와 같아 보입니다. –

+0

'info'에는 중첩 된 매개 변수가 있기 때문입니다. 'permit (: provider, : uid, info : [: email])'을 시도하십시오. 나는 그것이 작동 코드를 변경하지 않아도 좋을 것이라고 동의하지만, 환경이 바뀌었기 때문에 코드가 이에 맞게 수정되어야한다. OTOH, 그것은 더 나은 변화입니다. 그래서 그다지 신경 쓰지 않을 것입니다. 베스트! – wicz

1

이에 gemfile의 RSpec에 버전을 변경해보십시오 :

gem "rspec-rails", '~> 2.14.0.rc1' 
+0

이미 RSpec 3.1.0을 사용 중이므로 다운 그레이드하는 것이 불편할 수 있습니다. 어쨌든 이것이 어떻게 도움이되는지는 분명하지 않습니다. –

+0

예를 들어 이? http://stackoverflow.com/questions/17335329/activemodelforbiddenattributeserror-when-creating-new-user – userden

+0

네, 관련이 있습니다. –

관련 문제