在Rails 5.0.0.beta3,-api选项中使用accepts_nested_attributes_for时出现问题

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

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

为了测试,我制作了一个新的应用程序,只使用了ANAF文档中的成员和post的测试用例:

class Member < ApplicationRecord has_many :posts accepts_nested_attributes_for :posts end 

 class Post < ApplicationRecord belongs_to :member end 

(这些类定义是由Rails脚手架生成器生成的,所以inheritance自ApplicationRecord,而不是ActiveRecord :: Base,但是根据这篇文章 ,这并不重要。)

对于已定义的类别,以及创建和运行的匹配迁移,我启动了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 # 

没有快乐!

当我将create拆分为new,然后保存!时,我得到相同的结果,有一个更清晰的错误:

 >> member = Member.new(params[:member]) # 

member.save!
(15.0ms)BEGIN ActiveRecord :: RecordInvalid:validation失败:post成员必须存在
来自/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
raise_validation_error'
from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/validations.rb:50: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:in save!' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:324:in block in save!’ 来自/Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:395:来自/Users/pauldavis/.rvm 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:in block 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:in transaction’from /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:in transaction’来自/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:in with_trans中 action_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:in save!' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/suppressor.rb:45:in save!’ from(irb):14 from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/commands/console.rb:65:in start’from start' from /Users/pauldavis/.rvm/gems/ruby-2.2.4 /bundler/gems/rails-b785064958f9/railties/lib/rails/commands/console_helper.rb:9:in start’(0.2ms)ROLLBACK来自/ 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:in run_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:在load' from -e:1:in

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

谢谢!

我也遇到了同样的问题。
似乎规范已经从Rails 5改变了。
通过选择,以及之前和相同的操作。

belongs_to应默认为required:true#18233

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

我的笨拙可能会说英语,但......

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

计划在5.0.1中修复。

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

只需添加

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

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

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

在我的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的最后一个(注释掉的行)有一些问题,但希望这会让你知道如何解决这个问题。