【问题标题】:Trouble with accepts_nested_attributes_for in Rails 5.0.0.beta3, -api optionRails 5.0.0.beta3 中的accepts_nested_attributes_for 出现问题,-api 选项
【发布时间】:2016-06-26 19:56:14
【问题描述】:

我正在使用 Rails 5.0.0.beta3,使用 rails new 上的 -app 选项构建一个仅限 API 的应用程序,但我在使用 accept_nested_attributes_for 时遇到问题。

在我的应用程序中,创建(或新建,然后保存!)具有嵌套属性的对象失败,并显示父父对象必须存在的消息。

为了测试,我制作了一个新应用程序,并仅使用了测试用例,其中包含ANAF documentation 中的成员和帖子:

class Member < ApplicationRecord  
  has_many :posts  
  accepts_nested_attributes_for :posts  
end  

class Post < ApplicationRecord
 belongs_to :member
end

(这些类定义是由 Rails 脚手架生成器生成的,因此继承自 ApplicationRecord,而不是 ActiveRecord::Base,但对于 this post,这并不重要。)

定义了这些类,并创建并运行了匹配的迁移,我启动了一个 Rails 控制台并按照文档中的步骤操作:

params = { member: {
name: 'joe', posts_attributes: [
    { title: 'Kari, the awesome Ruby documentation browser!' },
    { title: 'The egalitarian assumption of the modern citizen' },
    { title: '', _destroy: '1' } # this will be ignored
]}}  

{:member=>{:name=>"joe", :posts_attributes=>[{:title=>"Kari, the awesome Ruby documentation browser!"}, {:title=>"The egalitarian assumption of the modern citizen"}, {:title=>"", :_destroy=>"1"}]}}

然后:

>> member = Member.create(params[:member])
 (0.2ms)  BEGIN
 (0.4ms)  ROLLBACK
#<Member id: nil, name: "joe", created_at: nil, updated_at: nil>

不开心!

当我将 create 拆分为 new,然后 save! 时,我得到了相同的结果,但错误更清晰:

>> member = Member.new(params[:member])  
#<Member id: nil, name: "joe", created_at: nil, updated_at: nil>

member.save!
(15.0ms) 开始 ActiveRecord::RecordInvalid:验证失败:帖子成员必须存在
来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/validations.rb:78:in raise_validation_error'
from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/validations.rb:50:in
save! 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/attribute_methods/dirty.rb:30:in save!' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:324:inblock in save! 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:395:in block in with_transaction_returning_status' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:233:inblock in transaction' 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:189:in within_new_transaction' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:233:intransaction' 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:211:in transaction' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:392:inwith_transaction_returning_status' 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:324:in save!' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/suppressor.rb:45:insave! 来自 (irb):14 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/commands/console.rb:65:in start' from /Users/pauldavis/.rvm/gems/ruby-2.2.4 /bundler/gems/rails-b785064958f9/railties/lib/rails/commands/console_helper.rb:9:instart' (0.2ms) 回滚 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/commands/commands_tasks.rb:78:in console' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/commands/commands_tasks.rb:49:inrun_command! 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/command.rb:20:in run' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/commands.rb:18:in' 来自 /Users/pauldavis/Documents/Projects/Active/Rails/curious/doko/m.0/test_anaf/bin/rails:9:in require' from /Users/pauldavis/Documents/Projects/Active/Rails/curious/doko/m.0/test_anaf/bin/rails:9:in' 来自 -e:1:in load' from -e:1:in'

您对文档中的示例代码为何有效有任何想法吗?我的环境可能有问题吗? -api 选项是否会破坏 ActiveRecord 中的某些内容?顺便说一句,我正在使用 PostgreSQL

谢谢!

【问题讨论】:

  • 我一直在寻找解决方案几个小时,但我今天找到了解决方案,在这个有用的blog post 中。我认为应该在文档中提到optional: 参数,因为它是使代码如图所示工作所必需的。也许文档也应该更新,将超类也更改为 ApplicationRecord,尽管这似乎不太引人注目。

标签: ruby-on-rails postgresql activerecord ruby-on-rails-5


【解决方案1】:

我也遇到了同样的问题。
似乎规范已从 Rails 5 更改。
通过把选项,和前面一样的操作。

belongs_to should default to required: true #18233

class Post < ApplicationRecord
  belongs_to :member, optional: true
end

我笨拙会说英语,但是……

【讨论】:

  • 这让我难过了......三个小时。惊人的。终于结束了……
  • 其实这不是真正的问题。问题是 Rails 5 版本 accepts_nested_attributes_for 的真正错误。
  • 见 Henrique Jensen 的回答。 (解决方案:升级到 Rails 5.1.1)
  • 谢谢。有用。升级到 rails 5.1.2 效果也很好。
【解决方案2】:

这是一个报告为rails#25198 的回归。正如所指出的,您可以使用inverse_of 作为解决方法。

计划在 5.0.1 中修复。

【讨论】:

  • 关于 5.0.1 中的修复:我可以报告它仍在 5.2 中发生。您提出的解决方法确实可以解决问题。谢谢!
【解决方案3】:

我遇到了同样的问题,我在https://github.com/rails/rails/issues/18233找到了解决方案

只需添加

class Post < ApplicationRecord
belongs_to :member, required: false
end

Rails 5 中的accepts_nested_attributes_for 似乎有问题,因此您需要将required: false 添加到您的子模型中。

【讨论】:

  • 感谢您链接到错误报告。
【解决方案4】:

我发现将inverse_of 选项添加到关联允许accepts_nested_attributes 工作。比猴子修补好,仍然允许验证关联

【讨论】:

    【解决方案5】:

    我在我的 Rails 5 beta 3 应用程序中也遇到了accepts_nested_attributes_for 的问题,并且似乎有问题。理想情况下,应该提交一个错误报告,但我们没有时间正确地完成它。我们有以下设置:

    accepts_nested_attributes_for :attachments, allow_destroy: true
    

    最终,我们不得不像这样对模型内部的方法进行猴子补丁:

      def attachments_attributes=(attributes)
        attributes.reject! do |_attachment|  
          if _attachment = Attachment.find(_attachment['id'])
            if _attachment.drop_id.nil?
              attachments << _attachment
              next true
            end
          end
          next false
        end
        # assign_nested_attributes_for_collection_association(:attachments, attributes)
      end
    

    唯一的问题是带有assign_nested_attributes_for_collection_association 的最后一行(注释掉的行)有一些问题,但希望这能让您了解如何解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多