【发布时间】: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:inraise_validation_error'save! 来自 /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/attribute_methods/dirty.rb:30:in
from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/validations.rb:50:insave!' 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:inblock 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:inwithin_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:intransaction' 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:insave!' 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:instart' 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:inconsole' 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:inrun' 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:inrequire' from /Users/pauldavis/Documents/Projects/Active/Rails/curious/doko/m.0/test_anaf/bin/rails:9:in' 来自 -e:1:inload' from -e:1:in'
您对文档中的示例代码为何有效有任何想法吗?我的环境可能有问题吗? -api 选项是否会破坏 ActiveRecord 中的某些内容?顺便说一句,我正在使用 PostgreSQL
谢谢!
【问题讨论】:
-
我一直在寻找解决方案几个小时,但我今天找到了解决方案,在这个有用的blog post 中。我认为应该在文档中提到
optional:参数,因为它是使代码如图所示工作所必需的。也许文档也应该更新,将超类也更改为 ApplicationRecord,尽管这似乎不太引人注目。
标签: ruby-on-rails postgresql activerecord ruby-on-rails-5