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:为什么需要它?你只能有一个音高,如果它不存在你总是创造它?