PJD*_*rna 10 postgresql activerecord ruby-on-rails ruby-on-rails-5
我正在使用Rails 5.0.0.beta3,使用rails new上的-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脚手架生成器生成的,所以继承自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
#<Member id: nil, name: "joe", created_at: nil, updated_at: nil>
没有快乐!
当我将create分成new,然后保存!时,我得到相同的结果,有一个更清晰的错误:
>> member = Member.new(params[:member])  
#<Member id: nil, name: "joe", created_at: nil, updated_at: nil>
member.save!
(15.0ms)BEGIN ActiveRecord :: RecordInvalid:验证失败:帖子成员必须存在
于/Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/validations. rb:78:救了!" 来自/Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/attribute_methods/dirty.rb:30:in block in save!' 来自/Users/pauldavis/.rvm的/Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:395:in block in transaction' /gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:189:in transaction'from /Users/pauldavis/.rvm/gems/ruby-2.2 .4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:211:in with_transaction_returning_status'from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9 /activerecord/lib/active_record/transactions.rb:324: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'(0.2 ms)来自/Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/commands/commands_tasks.rb:78:in run_command!'的回滚 来自/Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/command.rb:20:in '来自/ Users/pauldavis/Documents/Projects/Active /Rails/curious/doko/m.0/test_anaf/bin/rails:9:in'from -e:1:in 'raise_validation_error'
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 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: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' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/transactions.rb:392:insave!' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/activerecord/lib/active_record/suppressor.rb:45:instart' from /Users/pauldavis/.rvm/gems/ruby-2.2.4 /bundler/gems/rails-b785064958f9/railties/lib/rails/commands/console_helper.rb:9:inconsole' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/commands/commands_tasks.rb:49:inrun' from /Users/pauldavis/.rvm/gems/ruby-2.2.4/bundler/gems/rails-b785064958f9/railties/lib/rails/commands.rb:18:inrequire' from /Users/pauldavis/Documents/Projects/Active/Rails/curious/doko/m.0/test_anaf/bin/rails:9:inload' from -e:1:in
有关为什么文档中的示例代码有效的任何想法?我的环境可能有问题吗?-api选项是否会破坏ActiveRecord中的某些内容?顺便说一下,我正在使用PostgreSQL
谢谢!
小智 9
我也遇到了同样的问题.
似乎规范已经从Rails 5改变了.
通过选择,以及之前和相同的操作.
belongs_to应默认为required:true#18233
class Post < ApplicationRecord
  belongs_to :member, optional: true
end
我的笨拙可能会说英语,但......
我在 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一些问题,但希望这能为您提供如何解决此问题的想法。
| 归档时间: | 
 | 
| 查看次数: | 3820 次 | 
| 最近记录: |