【问题标题】:What happened to build() in Ruby on Rails 5Ruby on Rails 5 中的 build() 发生了什么
【发布时间】:2016-10-30 00:40:59
【问题描述】:

我正在使用 Rails 4 / 5 中的嵌套表单。在 Rails4 中使用 @my_model_instance.build 的代码似乎在 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 版本:

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

【问题讨论】:

  • @item.item_abilities.build 对我来说听起来不错,但我不确定此代码 ItemType.item_abilities.build 是否有意义。也许这就是 Rails 5 中错误的原因。我建议你也为这个问题添加一个标签 ruby​​-on-rails-5。
  • 您的 Rails 5 和 Rails 4 有单独的项目吗?错误似乎来自github.com/rails/protected_attributes
  • @gen:你说的很对。我已经相应地修复了帖子。
  • @oreoluwa:除了控制器和视图之外,项目是相同的。感谢您指出 protected_attributes gem,从 Gemfile 中删除该 gem 确实可以解决问题。看起来那个是罪魁祸首。感谢您指出这一点;)

标签: ruby-on-rails ruby ruby-on-rails-5 attr-protected


【解决方案1】:

protected_attributes gem,仍然在 Rails 上徘徊 3->4 天,导致了上述问题。

我在protected_attributes gem 网站上发布了一个错误,他们回复说 Rails 5 将不支持 gem。

如果其他人有此问题,可以在此处找到解决此问题的 Rails“正确”方法:How is attr_accessible used in Rails 4? 或此处:http://api.rubyonrails.org/classes/ActionController/StrongParameters.html

感谢@oreoluwa 为我指明了正确的方向

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多