Rails - Cocoon Gem - 填充外键 ID
Rails - Cocoon Gem - populating foreign key id
我正在尝试使用带有 cocoon gem 的简单表单将子表单嵌套在父 class 表单中。
我有提案和推介的模型。
协会是:
提案
has_one :pitch, inverse_of: :proposal
accepts_nested_attributes_for :pitch, reject_if: :all_blank, allow_destroy: true
音高
belongs_to :proposal, inverse_of: :pitch
在我的申请表中,我有:
<%= f.simple_fields_for :pitch do |f| %>
<%= f.error_notification %>
<%= render 'pitches/pitch_fields', f: f %>
<% end %>
<%= link_to_add_association 'Pitch', f, :pitch, partial: 'pitches/pitch_fields' %>
在我的提案控制器中,我有:
def new
@proposal = Proposal.new
@proposal.build_pitch
# authorize @proposal
end
def edit
@proposal.build_pitch unless @proposal.pitch
end
def proposal_params
params.require(:proposal).permit(:title, :description,
pitch_attributes: [:id, :problem, :solution, :remark, :_destroy ])
end
pitches/_pitch_fields.html.erb 有:
<div class="nested-fields">
<div class="form-inputs">
<%= f.input :problem, as: :text,
# :label => text_for_problem(current_user, @pitch.proposal),
:label => 'What issue does this proposal address?',
:input_html => {:rows => 10} %>
</div>
当我保存所有这些并尝试时,表单加载并且我可以完成表单,但是 proposal_id 的外键保存为 nil。
如果我尝试编辑表单,我会收到一条错误消息:
Couldn't find Pitch with ID=5 for Proposal with ID=10
当我尝试时:
pitch.errors.full_messages
NameError: undefined local variable or method `pitch' for main:Object
我需要做什么才能强制使用提案 ID 设置推介 table 中的 proposal_id 属性?
您没有显示您的 _picthces/pitch_fields_ 部分内容,但请确保它有 proposal_id
的隐藏字段。
此外,将 proposal_id
添加到 proposal_params
方法中的 pitch_attributes
数组。
如果有任何其他问题,请在控制器的 edit
方法中放置一个断点,并检查 proposal_params
中的内容与 @proposal
对象中设置的内容。
这有点奇怪,恕我直言 rails 中的错误,但 link_to_add_association
将尝试构建新的 pitch
以便能够正确呈现它。这将有效地删除 现有推介。
所以解决方案是在 link_to_add_association
上添加选项 force_non_association_create: true
。或者完全放弃 link_to_add_association
:为什么需要它?你只能有一个音高,如果它不存在你总是创造它?
我正在尝试使用带有 cocoon gem 的简单表单将子表单嵌套在父 class 表单中。
我有提案和推介的模型。
协会是:
提案
has_one :pitch, inverse_of: :proposal
accepts_nested_attributes_for :pitch, reject_if: :all_blank, allow_destroy: true
音高
belongs_to :proposal, inverse_of: :pitch
在我的申请表中,我有:
<%= f.simple_fields_for :pitch do |f| %>
<%= f.error_notification %>
<%= render 'pitches/pitch_fields', f: f %>
<% end %>
<%= link_to_add_association 'Pitch', f, :pitch, partial: 'pitches/pitch_fields' %>
在我的提案控制器中,我有:
def new
@proposal = Proposal.new
@proposal.build_pitch
# authorize @proposal
end
def edit
@proposal.build_pitch unless @proposal.pitch
end
def proposal_params
params.require(:proposal).permit(:title, :description,
pitch_attributes: [:id, :problem, :solution, :remark, :_destroy ])
end
pitches/_pitch_fields.html.erb 有:
<div class="nested-fields">
<div class="form-inputs">
<%= f.input :problem, as: :text,
# :label => text_for_problem(current_user, @pitch.proposal),
:label => 'What issue does this proposal address?',
:input_html => {:rows => 10} %>
</div>
当我保存所有这些并尝试时,表单加载并且我可以完成表单,但是 proposal_id 的外键保存为 nil。
如果我尝试编辑表单,我会收到一条错误消息:
Couldn't find Pitch with ID=5 for Proposal with ID=10
当我尝试时:
pitch.errors.full_messages
NameError: undefined local variable or method `pitch' for main:Object
我需要做什么才能强制使用提案 ID 设置推介 table 中的 proposal_id 属性?
您没有显示您的 _picthces/pitch_fields_ 部分内容,但请确保它有 proposal_id
的隐藏字段。
此外,将 proposal_id
添加到 proposal_params
方法中的 pitch_attributes
数组。
如果有任何其他问题,请在控制器的 edit
方法中放置一个断点,并检查 proposal_params
中的内容与 @proposal
对象中设置的内容。
这有点奇怪,恕我直言 rails 中的错误,但 link_to_add_association
将尝试构建新的 pitch
以便能够正确呈现它。这将有效地删除 现有推介。
所以解决方案是在 link_to_add_association
上添加选项 force_non_association_create: true
。或者完全放弃 link_to_add_association
:为什么需要它?你只能有一个音高,如果它不存在你总是创造它?