Ruby on rails 如何在Rails 3.2中设置深度嵌套表单

Ruby on rails 如何在Rails 3.2中设置深度嵌套表单,ruby-on-rails,ruby-on-rails-3,activerecord,nested-forms,nested-attributes,Ruby On Rails,Ruby On Rails 3,Activerecord,Nested Forms,Nested Attributes,我试图在rails中构建一个相当复杂的嵌套表单,但我被卡住了 基本上,我有三个模型-申请者、数据点、申请者数据点值 用户可以创建一个新的数据点,给它一个名称,性别等。选择它的类型字符串,整数等。。该类型确定数据最终将保存在AppliantDataPointValue表中的哪一列 然后,我希望用户在创建新申请者时,能够将每个数据点的值添加到applicationDataPointValue表中 我的模型如下所示: 申请人: class Applicant < ActiveRecord::Ba

我试图在rails中构建一个相当复杂的嵌套表单,但我被卡住了

基本上,我有三个模型-申请者、数据点、申请者数据点值

用户可以创建一个新的数据点,给它一个名称,性别等。选择它的类型字符串,整数等。。该类型确定数据最终将保存在AppliantDataPointValue表中的哪一列

然后,我希望用户在创建新申请者时,能够将每个数据点的值添加到applicationDataPointValue表中

我的模型如下所示:

申请人:

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
应用程序数据点值:

class ApplicantDataPointValue < ActiveRecord::Base
  belongs_to :data_point
  belongs_to :applicant
end
但是我不知道在我的控制器的“新建”和“创建”部分应该做什么,也不知道如何构造表单


如果您有任何见解,我将不胜感激。

据我所知,用户的表单还将包含多个AppliantDataPointValue字段。但是这个表单不允许创建新的数据点字段,对吗

在“控制器新操作”中,您需要使用关联的数据点值设置模型:

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 %>

参考资料:

Fiona,谢谢。这似乎朝着正确的方向发展。但是,我需要将结果保存到AppliantDataPointValues表中正确的列string、integer等中,因此必须在我的表单中包含一组IF语句,这些语句根据数据类型呈现正确的字段文本等。但是,当我单击“保存”时,表单不会保存,我得到了第一个IF的nil:NilClass的ActionView::Template::Error undefined方法“data\u point\u type”。有什么想法吗?:也就是说,我是否需要向控制器的“创建”部分添加一些内容?或者我是否应该在AppliantDataPointValue列中处理将值保存在哪一列的决策?您能告诉我您的创建方法吗?只有在模型失败的情况下,它才应该尝试重新渲染表单,这是一个单独的问题。签出。`def create@applicator=applicator.newparams[:applicator]response_to do | format |如果@applicator.save format.html{重定向至@applicator,注意:'申请人已成功创建。}format.json{render json:@applicator,status::created,location:@applicator}else format.html{render action:new}format.json{render json:@applicator.errors,status::unprocessable_entity}end`