2010-05-07 45 views
0

我遇到了一个实例化具有指定属性的ListItem对象的问题。由于某些原因,即使我指定了值,所有属性都设置为nil。但是,如果我指定List的属性,则它们将保留其值。Rails:无法设置子模型的任何属性

属性的List保留其值:

>> list = List.new(:id => 20, :name => "Test List") 
=> #<List id: 20, name: "Test List"> 


属性为ListItem保留其值:

>> list_item = ListItem.new(:id => 17, :list_id => 20, :name => "Test Item") 
=> #<ListItem id: nil, list_id: nil, name: nil> 



更新#1

我认为id是不保留其值的唯一属性,但意识到将ListItem的任何属性设置为nil



更新#2

我添加validates_associated :list_itemsList类减轻关于name属性是空白错误。

但是,我仍然不能明确地将id分配给新的ListItem



list.rb:

class List < ActiveRecord::Base 
    has_many :list_items, :dependent => :destroy 

    accepts_nested_attributes_for :list_items, 
            :reject_if => lambda { |a| a[:name].blank? }, 
            :allow_destroy => true 
end 

list_item.rb:

class ListItem < ActiveRecord::Base 
    belongs_to :list 

    validates_presence_of :name 
end 

schema.rb

ActiveRecord::Schema.define(:version => 20100506144717) do 

    create_table "list_items", :force => true do |t| 
    t.integer "list_id"  
    t.string "name"  
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "lists", :force => true do |t| 
    t.string "name"   
    t.datetime "created_at" 
    t.datetime "updated_at"   
    end 

end 

回答

2

我在本地设置中创建了您的模型和表格。我没有遇到任何错误。必须有一些类名冲突,或者你有一些before_save过滤器/观察者重置值。

注意

我会改变型号名称是更具体一点。这是很容易与名字,如ListListItem

0

嗯,

我遇到类似的事情时,验证无法正常工作。尝试

ListItem.create!(:id => 17, :list_id => 20, :name => "Test Item") 

如果模型无效,这应该会给你更直接的反馈。

+0

我收到以下错误消息,当我执行上面的语句运行的类名冲突:“的ActiveRecord :: RecordInvalid:验证失败:名称不能为空” 我不知道为什么它的名称属性显然不是空白时抛出此错误。 – 2010-05-07 18:01:55

+0

这可能是你指定':id'。试试看看 – Ceilingfish 2010-05-07 18:06:04

+0

我把':id'取出来了,而且我仍然得到:'ActiveRecord :: RecordInvalid:验证失败:名称不能为空'。我很困惑。 – 2010-05-07 18:10:38