2012-04-09 11 views
0

Ich erstelle eine Rails-Anwendung mit TDD mit rspec. Ich erhalte eine Fehlermeldung kann ich nicht entfernen:Rails und Rspec - kann keine geschützten Attribute massenweise zuweisen

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

Hier ist mein Benutzer spec:

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 

Und mein 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 

Ende

Wenn ich den mass-assign Fehler debuggen, indem ich uid und info dem attr_accessible hinzufüge, bekomme ich noch den folgenden Fehler unknown attribute: info.

+1

Was macht das in Ihrem @attr? '" info "=> {" name "=>" Beispiel "}' –

+0

Sie haben Recht, es muss nicht dorthin gehen. Die Sache ist, ich muss 'auth [" info "]' zu 'create_with_omniahuth' übergeben. Wie kann ich das machen? –

+0

Ich habe eine Antwort erstellt, die für beide Fälle funktionieren sollte. –

Antwort

1

Wenn Sie das, was Sie als @attr mit info hatten, zusammenführen, dann existiert es für den Aufruf create_with_omniahuth, aber nicht für die regulären create-Methoden.

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

danke, ich hatte es geschafft, etwas ähnliches zu deinem Code zu bekommen. Soll ich 'expect {...} verwenden, anstatt rspec selbst einen Fehler wie im Code meiner Frage auslösen zu lassen? –

+0

Cool ... Ich hätte irgendeine Form von positiven Behauptungen im Code. Ich denke so etwas wie 'user = User.create_with_omniauth; user.should be_persisted' ist noch besser. –

Verwandte Themen