【问题标题】:How to setup a deeply nested form in Rails 3.2如何在 Rails 3.2 中设置深度嵌套的表单
【发布时间】:2012-12-13 12:25:38
【问题描述】:

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

基本上,我有三个模型 - ApplicantDataPointApplicantDataPointValue

用户可以创建一个新的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

申请者数据点值:

class ApplicantDataPointValue < ActiveRecord::Base
  belongs_to :data_point
  belongs_to :applicant
end

但我不知道在控制器的“新建”和“创建”部分中做什么或如何构造表单。

任何见解将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord nested-forms nested-attributes


    【解决方案1】:

    据我了解,用户的表单也将有多个申请人数据点值字段。 (但该表单不允许创建新的 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

    【讨论】:

    • 菲奥娜,谢谢。这似乎正朝着正确的方向前进。但是,我需要将结果保存到 ApplyDataPointValues 表中的正确列(字符串、整数等)中,因此必须在我的表单中包含一堆 IF 语句,这些语句根据 data_point.type 呈现正确的 field_text 等。为他们。但是,当我单击保存时,表单不会保存,并且我得到了第一个 IF 的 ActionView::Template::Error (undefined method 'data_point_type' for nil:NilClass)。有什么想法吗?:&lt;% if data_point_value.data_point.data_point_type == "string" %&gt;
    • IE我还需要在控制器的#Create 部分添加一些内容吗?
    • 或者我应该决定将值保存在哪一列中的 ApplyDataPointValue 列?
    • 你能告诉我你的create方法吗?如果模型的save 失败,它应该只尝试重新渲染表单,这是一个单独的鱼锅。查看railscasts.com/episodes/196-nested-model-form-revised
    • ` def create @applicant = Apply.new(params[:applicant]) respond_to do |format| if @applicant.save format.html { redirect_to @applicant, notice: '申请人已成功创建。' } format.json { render json: @applicant, status: :created, location: @applicant } else format.html { render action: "new" } format.json { render json: @applicant.errors, status: :unprocessable_entity }结束结束结束`
    猜你喜欢
    • 2015-11-27
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多