rails Model.create(:attr =>“value”)返回带有未初始化字段的模型

时间:2011-02-27 22:33:09

标签: ruby-on-rails ruby-on-rails-3

这真的让我很难过。如果我使用#new然后#save进行处理,则此过程正常,但#create会返回一个模型实例,其中所有字段都设置为nil

e.g: 出乎意料的行为:

ruby-1.9.2-p0 > EmailDefault.create(:description=>"hi")
 => #<EmailDefault id: nil, description: nil, created_at: nil, updated_at: nil> 

预期行为:

ruby-1.9.2-p0 > e = EmailDefault.new
 => #<EmailDefault id: nil, description: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p0 > e.description = "hi"
 => "hi"
ruby-1.9.2-p0 > e.save
 => true 
ruby-1.9.2-p0 > EmailDefault.last
 => #<EmailDefault id: 4, description: "hi", created_at: "2011-02-27 22:25:33", updated_at: "2011-02-27 22:25:33"> 

我做错了什么?

- update-- 结果我误用了attr_accessor。我想添加一些非数据库属性,所以我用:

attr_accessible :example_to, :cc_comments

这是错误的,并引起了@Heikki提到的情况。我需要做的是:

attr_accessor :example_to, :cc_comments

1 个答案:

答案 0 :(得分:1)

您需要使用attr_accessible将这些属性列入白名单以启用质量分配。

http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html#method-i-attr_accessible

- 修改

默认情况下,所有属性都可用于质量分配。如果使用attr_accessible,则质量赋值仅适用于那些属性。 Attr_protected的工作方式相反,即。这些属性将受到保护,不受大规模分配。一次只能使用一个。我更喜欢使用attr_accessible的白名单。