当前位置: 首页 > 知识库问答 >
问题:

Rails5.0.0.beta3中accepts_nested_attributes_for的问题,-api选项

阳枫涟
2023-03-14

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

在我的应用程序中,创建(或新建,然后保存!)失败,并显示一条消息,提示父对象必须存在。

为了进行测试,我开发了一个新的应用程序,并在ANAF文档中对成员和帖子使用了测试用例:

class Member < ApplicationRecord  
  has_many :posts  
  accepts_nested_attributes_for :posts  
end  

class Post < ApplicationRecord
 belongs_to :member
end

(这些类定义是由Rails脚手架生成器生成的,所以继承自应用记录,而不是ActiveRecord::Ba,但在这篇文章中,这并不重要。)

创建并运行这些已定义且匹配的迁移后,我启动一个 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>

没有喜悦!

当我将创建拆分为新的,然后保存!,我得到了同样的结果,但有一个更清晰的错误:

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

会员.保存!< br >(15.0 ms)BEGIN active record::record invalid:验证失败:Posts成员必须< br >来自/Users/pauldavis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/validations . Rb:78:in < code > raise _ validation _ error ' < br > from/Users/Paul Davis/。' rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/validations . Rb:50:in save!'来自/Users/pauldavis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/attribute _ methods/dirty . Rb:30:in < code > save!来自/Users/pauldavis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/transactions . Rb:324:in 块in save!'来自/Users/pauldavis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/transactions . Rb:395:in < code > block in with _ transaction _ returning _ status ' from/Users/Paul Davis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/connection _ adapters/abstract/database _ statements . Rb:233:in block in transaction ' from/Users/Paul Davis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/connection _ adapters/abstract/transaction . Rb:189:in < code > within _ new _ transaction ' from/Users/Paul Davis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/connection _ adapters/abstract/database _ statements . Rb:233:in transaction ' from/Users/Paul Davis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/transactions . Rb:211:in < code > transaction ' from/Users/Paul Davis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/transactions . Rb:392:in with _ transaction _ returning _ status ' from/Users/Paul Davis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/transactions . Rb:324:in < code >保存!来自/Users/pauldavis/。' rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/active record/lib/active _ record/suppressor . Rb:45:in save!'发自(irb):14发自/Users/pauldavis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/rail ties/lib/rails/commands/console . Rb:65:in < code > start ' from/Users/Paul Davis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/rail ties/lib/rails/commands/console _ helper . Rb:9:in start '(0.2 ms)从/Users/pauldavis/回滚。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/rail ties/lib/rails/commands/commands _ tasks . Rb:78:in < code > console ' from/Users/Paul Davis/。' rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/rail ties/lib/rails/commands/commands _ tasks . Rb:49:in run _ command!'来自/Users/pauldavis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/rails-b 785064958 f 9/rail ties/lib/rails/command . Rb:20:in < code > run ' from/Users/Paul Davis/。rvm/gems/ruby-2 . 2 . 4/bundler/gems/Rails-b 785064958 f 9/rail ties/lib/Rails/commands . Rb:18:in ' from/Users/pauldavis/Documents/Projects/Active/Rails/好奇/doko/m . 0/test _ anaf/bin/Rails:9:in < code > require ' from/Users/pauldavis/Documents/Projects/Active/Rails/好奇/doko/m . 0/test _ anaf/bin/Rails:9

关于为什么文档中的此示例代码可以工作的任何想法?我的环境会不会有问题?-api 选项会破坏 ActiveRecord 中的某些内容吗?顺便说一句,我正在使用PostgreSQL

谢谢!

共有3个答案

壤驷穆冉
2023-03-14

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

只需添加

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

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

梁丘波鸿
2023-03-14

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

计划在5.0.1中修复。

殷宾白
2023-03-14

我也遇到了同样的问题。
似乎规范已经从Rails 5更改。
通过放置选项,和之前的操作相同。

belongs_to应默认为required:true#18233

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

这是我笨拙的可能会说英语,但。。。

 类似资料:
  • 我使用的是Ruby on Rails V3.2.2。我想解决在使用和RoR方法时与外键验证相关的问题。也就是说,我有以下模型类: 但是,如果我注释掉模型类中的,它会按预期工作,但是不验证外键似乎不是一个正确的方法。 如果我注释掉模型类中的,我仍然会得到错误:

  • 我的代码是这样的:

  • 编译时,我得到了这个错误:错误:任务执行失败:应用程序:进程调试资源。 错误:多个包名为com.google.android.gms的库 但是,当删除该行时:compile'com。谷歌。Android游戏服务:6.1.11' 我得到以下错误:错误:(41,42)错误:包com。谷歌。Androidgms。appindexing不存在错误:(42,42)错误:包com。谷歌。Androidgms。

  • 基于我前面的问题,我仍然试图弄清楚我的代码有什么问题。 我有一个最基本的主题:键和值是的一种类型,这是我的生产者代码: 我想使用key对事物进行分组,并使用Kafka Streams API将值放入ArrayList中。 这是我的Stream应用程序,它应该执行转换并将内容放入新主题: 我实现了我的Serde如下: 然而,我最终得到了这个例外: 我试图基于在Confluent的GitHub页面中找

  • 我正在为正在开发的移动应用程序设计RESTful API。我的问题是包含许多项目的大型集合。我知道一个好的做法是在集合中对大量结果分页。 我已经阅读了Facebook Graph API文档(https://developers.facebook.com/docs/graph-api/using-graph-api/v2.2),推特光标文档(https://dev.twitter.com/over