【问题标题】:Rails trying to build nested models but getting rollbackRails 尝试构建嵌套模型但回滚
【发布时间】:2018-10-24 16:52:35
【问题描述】:

我不确定为什么会发生这种情况,但我正在尝试使用 CompanyURLs 模型创建嵌套属性。

这是我所拥有的:

# app/models/company.rb
class Company < ApplicationRecord
    has_many :urls, dependent: :destroy
end

.

# app/models/url.rb
class Url < ApplicationRecord
  belongs_to :Company
end

.

例如,我有这个:

urls = [{:url=>"http://audit.site.com/"},
 {:url=>"http://bidboard.site.com/"},
 {:url=>"http://careers.sit.com/"}]

我正在尝试通过执行以下操作来创建一个具有这些 URL 的新公司:

company = Company.new(company_name: @report_data[:company_name], domain: @report_data[:domain])
company.urls.build(urls)
company.save

我从控制台收到回滚错误,不知道为什么。我相信这应该相对简单。基本上,用户将公司名称提交到此表单并启动此过程。

据我了解,我的迁移记录应该没问题。他们在这里:

class CreateCompanies < ActiveRecord::Migration[5.1]
  def change
    create_table :companies do |t|
      t.string :company_name
      t.string :domain

      t.timestamps
    end
  end
end

class CreateUrls < ActiveRecord::Migration[5.1]
  def change
    create_table :urls do |t|
      t.belongs_to :company, foreign_key: true
      t.string :url

      t.timestamps
    end
  end
end

知道我在这里做错了什么吗?

编辑

所以在调用company.errors 之后,我看到的是这样的:

 @base=#<Company:0x00007f71800f0e80 id: nil, company_name: "Random", domain: "random.com", created_at: nil, updated_at: nil>,
 @details=
  {:urls=>
    [{:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     {:error=>:invalid},
     ...

【问题讨论】:

  • 可以在调用company.save之后添加company.errors的输出吗
  • 我尝试复制它并且它工作正常。请尝试调用company.save!,因为如果记录无效,它将引发错误。
  • AFAIK company.urls.build 采用哈希(url 对象),而不是哈希数组。
  • @adbeel .new, .build, .create 等都采用哈希数组。这会同时创建/初始化多个记录。 “属性参数可以是哈希或哈希数组。这些哈希描述了要创建的对象的属性。” api.rubyonrails.org/classes/ActiveRecord/Persistence/…
  • 我有一个错字。 FML。我把它修好了。非常感谢大家!!!

标签: ruby-on-rails activerecord model attributes


【解决方案1】:

使用嵌套属性时需要使用inverse_of

基本上你的联想是这样的:

class Company < ApplicationRecord
    has_many :urls, dependent: :destroy, inverse_of: :company
end

class Url < ApplicationRecord
    belongs_to :company, inverse_of: :urls
end

通过这个link 更好地理解

另外,我建议您使用save! 来查看失败的原因。

【讨论】:

    【解决方案2】:

    请发布您的服务器日志,确保您有:

    1. 向 Url 模型添加了 foreign_key。
    2. 公司控制器中的白名单参数。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多