Rails: невозможно установить какой-либо атрибут дочерней модели - PullRequest
0 голосов
/ 07 мая 2010

У меня проблема с созданием экземпляра объекта ListItem с указанными атрибутами. По какой-то причине все атрибуты установлены на nil, даже если я указываю значения. Однако, если я укажу атрибуты для List, они сохранят свои значения.

Атрибуты для 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_items в класс List, что позволило устранить ошибку, связанную с пустым атрибутом 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 ]

2 голосов
/ 07 мая 2010

Я создал ваши модели и таблицы в моей локальной настройке.Я не обнаружил никаких ошибок.Должен быть конфликт имен классов ИЛИ у вас есть фильтры / наблюдатели before_save, сбрасывающие значения.

Примечание

Я бы изменил названия моделей, чтобы они были более конкретными.Очень легко столкнуться с конфликтами имен классов с именами вроде List и ListItem

0 голосов
/ 07 мая 2010

Хм,

Я сталкивался с чем-то похожим, когда проверки не работают должным образомПопробуйте

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

Это должно дать вам более прямую обратную связь, если модель неверна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...