несовместимость для acceptpts_nested_attributes_for между рельсами 2.3.5 и рельсами 2.3.8 - PullRequest
0 голосов
/ 23 марта 2011

Я только что обнаружил изменение в поведении между рельсами 2.3.5 и рельсами 2.3.8, и я не могу найти что-либо, прибегая к помощи.

У меня есть модели

class Book < ActiveRecord::Base
  has_many :authors
  accepts_nested_attributes_for authors
end

class Author < ActiveRecord::Base
  belongs_to :book
end

У меня естьпросмотр, чтобы заполнить книгу вложенными представлениями авторов.

В контроллере книги у меня есть действие обновления

def update
  @book = Book.find(params[:id])
  @book.attributes = params[:book]
  ....
end

params[:book] выглядит так:

{:name=>"a great book", "authors_attributes"=>{"1"=>{:id"=>"2", "_destroy"=>"", :name => "Boney M"}}}

ПоследниеВ моем процессе я хочу получить доступ к моей обновленной коллекции (перед сохранением объекта книги, например, для проверки) с помощью rails 2.3.5 @ book.authors дал мне коллекцию авторов, обновленную значением в params [: book] hash,Но с 2.3.8 он дает мне коллекцию авторов, загруженную из базы данных.

Моя проблема связана с функцией assign_nested_attributes_for_collection_association (/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/nested_attributes.rb).Возвращает объект AssociationProxy с @loaded = false.Таким образом, в первый раз, когда я хочу получить доступ к своей коллекции с помощью @ book.authors, она перезагружает ее из базы данных.Это было не так с рельсами 2.3.5.

Я что-то здесь упустил или где-то сообщалось об этом новом поведении?

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 02 июня 2011

Не уверен, если это связано, но я только заметил, что когда я обновил свое приложение с 2.3.5 до 2.3.8, я больше не могу обновить связанную запись. Система игнорирует обновленную информацию для уже существующих записей и будет добавлять только новые записи. Я обнаружил, что если я хочу обновить связанную запись, я должен удалить ее из БД, а затем создать ее снова. Полностью отстой.

class Product < ActiveRecord::Base
    has_many :allowed_design_types, :dependent => :destroy, :include => [:design_type], :order => 'design_types.name'
    has_many :design_types, :through => :allowed_design_types
    accepts_nested_attributes_for(
      :allowed_design_types, 
      :allow_destroy => true, 
      :reject_if => proc { |obj| p obj; !['1', 'true'].include?(obj.delete('allow')) }
    )
end

Это отправляется в параметрах, но полностью игнорируется:

"product"=>{"allowed_design_types_attributes"=>{"0"=>{"design_type_id"=>"5", "allow"=>"1", "product_id"=>"1", "id"=>"45", "your_price"=>"3", "_destroy"=>""}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...