我正在尝试在rails中构建一个相当复杂的嵌套表单并且卡住了。
基本上,我有三个模型 - Applicant
,DataPoint
,ApplicantDataPointValue
。
用户可以创建新的DataPoint
,给它命名(“性别”等),选择它的类型(“字符串”,“整数”等)。该类型确定最终将数据保存在ApplicantDataPointValue
表中的哪一列。
然后,我希望用户在创建新的Applicant
时,能够将每个DataPoint
的值添加到ApplicantDataPointValue
表中
我的模型如下所示:
申请人:
class Applicant < ActiveRecord::Base
has_many :applicant_data_point_values, dependent: :destroy
has_many :data_points, :through => :applicant_data_point_values
accepts_nested_attributes_for :data_points
accepts_nested_attributes_for :applicant_data_point_values
attr_accessible :data_points_attributes, :applicant_data_point_values_attributes
end
数据点:
class DataPoint < ActiveRecord::Base
has_many :applicant_data_point_values
has_many :applicants, :through => :applicant_data_point_values
accepts_nested_attributes_for :applicant_data_point_values
end
ApplicantDataPointValue:
class ApplicantDataPointValue < ActiveRecord::Base
belongs_to :data_point
belongs_to :applicant
end
但我不知道如何在我的控制器的“新”和“创建”部分做什么,或者如何构建表单。
非常感谢任何见解。
答案 0 :(得分:1)
根据我的理解,用户的表单也将有多个ApplicantDataPointValue字段。 (但该表单不允许创建新的DataPoint字段,对吗?)
在控制器new
操作中,您需要使用关联的数据点值设置模型:
def new
@user = User.new
DataPoint.all.each do |data_point|
applicant_data_point_value = @user.applicant_data_point_values.build
applicant_data_point_value.data_point = data_point
end
end
然后,为每个数据点值显示一个文本框。
<%= form_for @user do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<% @user.applicant_data_point_values.each do |data_point_value| %>
<%= f.fields_for :applicant_data_point_values, data_point_value do |fields| %>
<%= fields.label :value, data_point_value.data_point.type %>
<%= fields.text_field :value %>
<% end %>
<% end %>
参考:http://railscasts.com/episodes/196-nested-model-form-part-1