【问题标题】:Rails: submitting a form with multiple objectsRails:提交具有多个对象的表单
【发布时间】:2009-01-07 18:49:12
【问题描述】:

我正在创建一个 Rails 应用程序,但遇到了一些障碍。我想要一个“为 DataType1 创建新记录”表单,它不仅可以为 DataType1 创建一个新行,还可以为 DataType2 插入多达四个新行。

我对 fields_for 了如指掌,但我的问题是我需要提交最多四个 DataType2,而它们与 DataType1 的唯一联系是它们是通过 DataType2 中的字段引用的。

这是简化的数据库:

create_table :data_type_1 do |t|
  t.string     :title
  t.text       :body

  t.timestamps
end

create_table :data_type_2 do |t|
  t.belongs_to :parent

  t.timestamps
end

现在,我已经建立了所有关系和一切;那不是问题。问题是我似乎无法弄清楚如何将 DataType2 的参数与新 DataType1 的参数一起传递。一旦有人向我展示了我应该如何执行此操作,我就可以相当轻松地设置新的 DataType2 以与新的 DataType1 关联。

这是我目前的表格:

<% form_for(@data_type_1) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>

  # Etc...

  <p>
    # New items need to be iterated here
    # DataType2[1]: [         ]
    # DataType2[2]: [         ]
    # DataType2[3]: [         ]
    # DataType2[4]: [         ]
    # (Note that these numbers are just examples.)
  </p>

  <p>
    <%= f.submit "Create" %>
  </p>
<% end %>

我对 Rails 比较陌生,如果这个问题有点啰嗦,我深表歉意。

【问题讨论】:

    标签: sql ruby-on-rails ruby activerecord


    【解决方案1】:

    This RailsCast 谈到将“DataType2”列表插入“DataType1”。有趣的部分是这些

    app/views/projects/_form.html.erb

      <% for task in @project.tasks %>
        <% fields_for "project[task_attributes][]", task do |task_form| %>
          <p>
            Task: <%= task_form.text_field :name %>
          </p>
        <% end %>
      <% end %>
    

    app/models/project.rb

    def task_attributes=(task_attributes)
      task_attributes.each do |attributes|
        tasks.build(attributes)
      end
    end
    

    【讨论】:

    • 对于以后遇到此答案的任何人,Rails 添加了accepts_nested_attributes_for 来为您处理模型代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多