2012-04-09 84 views
0

我正在使用rspec創建一個Rails應用程序和TDD。我得到一個錯誤,我無法刪除:Rails和Rspec--不能批量分配受保護的屬性

Failure/Error: invalid_user = User.new(@attr.merge("provider" => "")) 
ActiveModel::MassAssignmentSecurity::Error: 
    Can't mass-assign protected attributes: uid, info 

這裏是我的用戶規格:

user_spec.rb

require 'spec_helper' 

describe User do 
    before(:each) do 
    @attr = {"provider" => "providerexample", "uid" => "uidexample", "info" => {"name" =>  "Example"}} 
end 

it "should create a new instance given valid attributes" do 
    user = User.create_with_omniauth(@attr) 
end 

it "should require a provider" do 
    invalid_user = User.new(@attr.merge("provider" => "")) 
    invalid_user.should_not be_valid 
end 

it "should require a uid" do 
    invalid_user = User.new(@attr.merge("uid" => "")) 
    invalid_user.should_not be_valid 
end 
end 

而且我user.rb

class User < ActiveRecord::Base 
    attr_accessible :name, :credits, :email, :provider 

    validates :name, :provider, :uid, :presence => true 

    def self.create_with_omniauth(auth) 
    create! do |user| 
    user.provider = auth["provider"] 
    user.uid  = auth["uid"] 
    user.name  = auth["info"]["name"] 
    end 
end 

如果我通過將uidinfo添加到attr_accessible來調試mass-assign錯誤,我仍然收到以下錯誤unknown attribute: info

+1

這是幹什麼用的@attr? '「info」=> {「name」=>「示例」}' – 2012-04-09 01:54:20

+0

你是對的,它不能去那裏。事情是我需要將'auth [「info」]'傳遞給'create_with_omniauth'。我怎樣才能做到這一點? – 2012-04-09 01:59:17

+0

我創建了一個應該適用於這兩種情況的答案。 – 2012-04-09 02:05:00

回答

1

如果您將@attr與info所合併,則它將存在於create_with_omniauth調用中,但不是常規的create方法。

describe User do 
    let(:user_attributes) { {"provider" => "providerexample", "uid" => "uidexample"} } 

    it "should create a new instance given valid attributes" do 
    expect { 
     User.create_with_omniauth(user_attributes.merge({"info" => {"name" => "example"})) 
    }.to not_raise_error 
    end 
end 
+0

謝謝,我設法得到了類似於您的代碼的東西。我應該用'expect {...'而不是讓rspec自己提出一個錯誤,就像我的問題代碼一樣? – 2012-04-09 02:08:21

+0

酷...我會在代碼中使用某種形式的肯定斷言。我認爲像'user = User.create_with_omniauth; user.should be_persisted'仍然更好。 – 2012-04-09 02:17:04

相關問題