Rails和Rspec--不能批量分配受保护的属性
我正在使用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
末
如果我通过将uid
和info
添加到attr_accessible
来调试mass-assign
错误,我仍然收到以下错误unknown attribute: info
。
如果您将@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
谢谢,我设法得到了类似于您的代码的东西。我应该用'expect {...'而不是让rspec自己提出一个错误,就像我的问题代码一样? – 2012-04-09 02:08:21
酷...我会在代码中使用某种形式的肯定断言。我认为像'user = User.create_with_omniauth; user.should be_persisted'仍然更好。 – 2012-04-09 02:17:04
这是干什么用的@attr? '“info”=> {“name”=>“示例”}' – 2012-04-09 01:54:20
你是对的,它不能去那里。事情是我需要将'auth [“info”]'传递给'create_with_omniauth'。我怎样才能做到这一点? – 2012-04-09 01:59:17
我创建了一个应该适用于这两种情况的答案。 – 2012-04-09 02:05:00