Ruby on Rails - 在另一个Model的表单上添加Model中的字段

Nun*_*iro 2 forms ruby-on-rails custom-fields

我有两个型号ContractAddendum.合同has_many :addendums和附录belongs_to :contract

创建新合同时,将自动创建新的附录,但创建新附录需要一些附加要素.如何value在合同表格中添加一个字段,该字段是附录中的属性,而不是合同中的属性?

Joe*_*edy 7

您正在寻找的是嵌套表单,这在RoR中很常见.有关嵌套和复杂表单的更多信息,请参阅Rails指南的一部分.我建议查看所有Rails指南,这些在学习框架时非常有用.

对于您的具体问题,请先告诉您的Contract模型accept_nested_attributes_for您的Addendum模型.

class Contract < ActiveRecord::Base
  has_many :addendum
  accepts_nested_attributes_for :addendums
end
Run Code Online (Sandbox Code Playgroud)

接下来,打开你的合同控制器,做两件事.一,建立addendum新的时候contract.二,addendums在你的contract_params方法中允许嵌套属性(假设你使用的是rails 4).

class ContractController < ApplicationController
  def new
    @contract = Contract.new
    @addendum = @contract.addendums.build
  end

  protected
    def contract_params
      params.require(:contact).permit(:field1, :field2, addendums_attributes: [:id, :value, :other_field])
    end
end
Run Code Online (Sandbox Code Playgroud)

最后,forms_forcontracts形式添加帮助器.

<%= form_for @contract do |f| %>

  <!-- contract fields -->

  Addendums:
  <ul>
    <%= f.fields_for :addendums do |addendums_form| %>
      <li>
        <%= addendums_form.label :value %>
        <%= addendums_form.text_field :value %>

        <!-- Any other addendum attributes -->

      </li>
    <% end %>
  </ul>
<% end %>
Run Code Online (Sandbox Code Playgroud)

有了这个,你应该全力以赴!快乐的编码!

  • 参见http://railscasts.com/episodes/196-nested-model-form-part-1或修订版. (2认同)