Что случилось с build() в Ruby on Rails 5

Я работаю с вложенными формами в Rails 4 / 5. Код, который использовал @my_model_instance.build в Rails4, похоже, не работает в Rails 5. Я не уверен, что это ошибка или это я.

Подробности:

Консоль Rails 4.2.3:

> @item = ItemType.new
=> #<ItemType id: nil, name: nil, .... >
> @item.item_abilities
=> #<ActiveRecord::Associations::CollectionProxy []>
> @item.item_abilities.build
=> #<ItemAbility id: nil, item_type_id: nil, ... >
> @item.item_abilities
=> #<ActiveRecord::Associations::CollectionProxy [#<ItemAbility id: nil, item_type_id: nil, ... ]>

Это работает как задокументировано / ожидается. Теперь давайте попробуем то же самое на той же кодовой базе в Rails 5 (rc2).

Консоль Rails 5.0.0rc2:

> @item = ItemType.new
=> #<ItemType id: nil, name: nil, .... >
> @item.item_abilities
=> #<ActiveRecord::Associations::CollectionProxy []>
> @item.item_abilities.build
ArgumentError: wrong number of arguments (given 2, expected 0..1)
from /var/lib/gems/2.3.0/gems/activerecord-5.0.0.rc2/lib/active_record/core.rb:312:in `initialize'
from /var/lib/gems/2.3.0/gems/activerecord-5.0.0.rc2/lib/active_record/inheritance.rb:65:in `new'
from /var/lib/gems/2.3.0/gems/activerecord-5.0.0.rc2/lib/active_record/inheritance.rb:65:in `new'
from /var/lib/gems/2.3.0/gems/protected_attributes-1.1.3/lib/active_record/mass_assignment_security/reflection.rb:8:in `build_association'
from /var/lib/gems/2.3.0/gems/protected_attributes-1.1.3/lib/active_record/mass_assignment_security/associations.rb:7:in `build_record'
from /var/lib/gems/2.3.0/gems/protected_attributes-1.1.3/lib/active_record/mass_assignment_security/associations.rb:25:in `build'
from /var/lib/gems/2.3.0/gems/protected_attributes-1.1.3/lib/active_record/mass_assignment_security/associations.rb:64:in `build'
from (irb):2
from /var/lib/gems/2.3.0/gems/railties-5.0.0.rc2/lib/rails/commands/console.rb:65:in `start'
from /var/lib/gems/2.3.0/gems/railties-5.0.0.rc2/lib/rails/commands/console_helper.rb:9:in `start'
from /var/lib/gems/2.3.0/gems/railties-5.0.0.rc2/lib/rails/commands/commands_tasks.rb:78:in `console'
from /var/lib/gems/2.3.0/gems/railties-5.0.0.rc2/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
from /var/lib/gems/2.3.0/gems/railties-5.0.0.rc2/lib/rails/commands.rb:18:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'

Так я этим занимаюсь или Rails5 сумасшедший?

Соответствующие разделы моделей:

item_type.rb

class ItemType < ActiveRecord::Base
    ## Relationships
    belongs_to :item_collection
    has_many :item_abilities
    has_many :item_instances

    accepts_nested_attributes_for :item_abilities

    ...
end

item_instance.rb

class ItemAbility < ActiveRecord::Base
    # Relationships
    belongs_to :item_type
   ...
end

Рубиновая версия:

ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

1 ответ

Решение

Это было protected_attributes драгоценный камень, все еще торчащий из Rails 3->4 дня, который вызвал проблему выше.

Я разместил ошибку на protected_attributes сайт gem, и они ответили, что этот камень не будет поддерживаться в Rails 5.

Если у кого-то еще есть эта проблема, "правильный" способ Rails исправить это можно найти здесь: Как attr_accessible используется в Rails 4? или здесь: http://api.rubyonrails.org/classes/ActionController/StrongParameters.html

Спасибо @oreoluwa за указание мне в правильном направлении

Другие вопросы по тегам