如何使用嵌套表单中的值设置外键?

时间:2018-08-02 06:12:41

标签: ruby-on-rails ruby-on-rails-5 nested-forms cocoon-gem

我有一个显示Content的Rails应用。每个内容都属于一个Source和一个源has_many个内容。每个源均包含一个name和一个domain

内容也属于Edition。我的应用程序的设置方式是,在创建/编辑Editions的表单中,我已经使用Cocoon gem嵌套了Contents的表单字段。

内容的嵌套字段包括一个link字段。我需要做的是对照Sources表中的各种link检查domains并在新创建/编辑的内容上设置相关的source_id

我当时想我可以在source_ideditions controller动作的update中设置相关的create。但是,由于我收到的唯一数据是带有嵌入式contents_attributes散列的params散列(由于未设置source_id,因此不包含对source的引用),如何我可以使用表单上提交的“链接”设置source_id吗?

这是我在editions_controller上的创建和更新操作:

def create
  @edition = Edition.new(edition_params)

  respond_to do |format|
    if @edition.save
      format.html { redirect_to @edition, notice: 'Edition was successfully created.' }
      format.json { render :show, status: :created, location: @edition }
    else
      format.html { render :new }
      format.json { render json: @edition.errors, status: :unprocessable_entity }
    end
  end
end

def update
  respond_to do |format|
    if @edition.update(edition_params)
      format.html { redirect_to @edition, notice: 'Edition was successfully updated.' }
      format.json { render :show, status: :ok, location: @edition }
    else
      format.html { render :edit }
      format.json { render json: @edition.errors, status: :unprocessable_entity }
    end
  end
end

这是使用的参数:

def edition_params
  params.require(:edition).permit(:date, 
                                  :clicks, 
                                  :product_id,
                                  contents_attributes: [:id,
                                                        :heading,
                                                        :body,
                                                        :link,
                                                        :top_story,
                                                        :section_id,
                                                        :_destroy
                                                       ]
                                 )
end

我应该在带有source_id的表单上有一个隐藏的输入吗?还是可以像在控制器上那样完成此操作?

1 个答案:

答案 0 :(得分:0)

如果您以内容形式设置了link值,并且有逻辑根据source的值来确定link,那么就不需要设置{{ 1}}或控制器中的形式。

设置source_id的最佳位置将在模型中,因此无论您如何创建source_id记录,无论是从版本表单,控制台还是其他控制器,都始终可以进行设置。在这种情况下,您不必担心。

在模型中具有这些关联和回调应该可以解决您的目的:

content