Rails生成belongs_to关联“必须存在”错误

时间:2018-08-17 14:28:04

标签: ruby-on-rails ruby ruby-on-rails-5

我正在尝试在rails的belongs_to模型关联中构建has_many模型。关联正确,但是显示错误“必须存在”。我尝试将optional:true设置为正确,但似乎不起作用。

模型

class User::Product < ApplicationRecord
  has_one: :promo_code
end

class User::PromoCode < ApplicationRecord
  belongs_to: :product, optional: true
  accepts_nested_attributes_for :product
end

PromoCodesController

def new
  @promo_code = User::PromoCode.new
  @product.build_product
end

def create
  @promo_code = User::PromoCode.new(promo_code_params)
  @promo_code.save
end

def promo_code_params
  params.require(:user_promo_code).permit(:product_id, :product_attributes => [:name])
end

表格

form_with(model: promo_code) do |form|
  form.fields_for :product do |f|
    f.text_field :name
  end
end

当表单保存时,会出现一个错误消息,指出“必须存在”,我假设这是指belongs_to中的外键。

任何关于我做错事的想法?我认为上面的代码是我与此问题相关的唯一相关代码。

2 个答案:

答案 0 :(得分:1)

查看由@engineersmnky链接的问题,看起来这是使用accepts_nested_attributes_for时的已知错误。

这可以通过使用inverse_of选项来阐明双向关系来解决:

class User::Product < ApplicationRecord
  has_one: :promo_code, inverse_of: :product
end

class User::PromoCode < ApplicationRecord
  belongs_to: :product, optional: true, inverse_of: :promo_code
  accepts_nested_attributes_for :product
end

尝试一下,看看它是否可以解决您的问题。

答案 1 :(得分:1)

分别在模型中尝试

 has_one :promo_code, -> { PromoCode.order(:id) }, class_name: 'PromoCode',inverse_of: :product


belongs_to :product, inverse_of: :promo_code