Rails新对象是零

时间:2014-05-08 05:08:28

标签: ruby-on-rails ruby ruby-on-rails-4

我再次使用rails并发现这种行为,当我创建一个具有某些属性的Post模型的新实例时,它告诉我所有属性都是零,为什么会发生?

Loading development environment (Rails 4.0.0)
2.0.0-p451 :001 > a = Post.new(title: "Rails", content: "Rails Post")
=> #<Post id: nil, title: nil, content: nil, author: nil, rating: nil, created_at: nil, updated_at: nil> 
2.0.0-p451 :002 > a.title
=> "Rails"
2.0.0-p451 :004 > a.content
=> "Rails Post" 
2.0.0-p451 :005 > a.inspect
=> "#<Post id: nil, title: nil, content: nil, author: nil, rating: nil, created_at: nil, updated_at: nil>"
2.0.0-p451 :006 > a.errors.messages
=> {}
2.0.0-p451 :007 > a.valid?
=> true

class Post < ActiveRecord::Base
  attr_accessor :title, :content, :author, :rating
end

1 个答案:

答案 0 :(得分:1)

您正在为所有属性定义attr_accessor,这是为同名实例变量定义getter和setter的快捷方式,如下所示:

def content
  @content
end

def content=(new_content)
  @content = new_content
end

对于模型具有的每个数据库字段,Rails还将使用这些名称自动生成方法。这些方法会相互冲突。

当您致电post.content = 'foo'时,您没有调用Rails生成的方法,而是在内部将您的模型的content属性设置为“foo”,您可以使用#{1}}。重新调用attr_accessor定义的方法,该方法将实例变量@content设置为&#39; foo&#39;。

inspect的输出迭代Rails定义的模型属性,而不是实例变量。

您是否真的要将这些属性声明为attr_accessible而不是attr_accessor