【发布时间】:2014-06-19 00:40:49
【问题描述】:
我有两个型号Contract 和Addendum。合同has_many :addendums和附录belongs_to :contract
创建新合同时,会自动创建一个新的附录,但需要一些额外的元素来创建新的附录。如何在合同的表单上添加字段value,它是附录中的属性,而不是合同中的属性?
【问题讨论】:
标签: ruby-on-rails forms custom-fields
我有两个型号Contract 和Addendum。合同has_many :addendums和附录belongs_to :contract
创建新合同时,会自动创建一个新的附录,但需要一些额外的元素来创建新的附录。如何在合同的表单上添加字段value,它是附录中的属性,而不是合同中的属性?
【问题讨论】:
标签: ruby-on-rails forms custom-fields
您要查找的是嵌套形式,这在 RoR 中很常见。有关嵌套和复杂表单的更多信息,请访问 section of a Rails Guide for that。我建议查看所有 Rails Guides,它们在学习框架时非常有用。
对于您的具体问题,请先将您的Contract 模型告诉accept_nested_attributes_for 您的Addendum 模型。
class Contract < ActiveRecord::Base
has_many :addendum
accepts_nested_attributes_for :addendums
end
接下来,打开你的合约控制器,做两件事。一,在创建新的contract 时创建addendum。二、在contract_params 方法中允许addendums 的嵌套属性(假设您使用的是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
最后,在 contracts 表单中添加 forms_for 助手。
<%= 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 %>
有了这个,你应该准备好了!编码愉快!
【讨论】:
create 或update 控制器方法中使用@contract.assign_params(contract_params) 来分配contract_params。然后你可以简单地调用@contract.addendum.first.value 来获取你的第一个附录的价值。这就是你要找的东西吗?
@contract.addendums.first.value。 addendums 应该是复数。对此感到抱歉。
create 我有 if contract.save createAddendum 和 createAddendum 是我在控制器上创建的一个函数,它将获取参数的值(关于 addendum_form)和基于其他字段计算的其他字段...