【问题标题】:Using form helpers to picking an object by name, but assigning the ID associated with that name使用表单助手按名称选择对象,但分配与该名称关联的 ID
【发布时间】:2013-10-31 01:44:13
【问题描述】:

我有一个Product 模型、一个Order 和一个OrderItem 模型。
一个OrderItem 对象有一个Product(也就是说,它belongs to 是一个产品)
Order 有多个订单项。

如果您想在订单中添加OrderItem,请填写表格。其中一个字段是输入将分配给此订单项目的产品。订单模型将product_id 存储为外键,因此在我编写时 Rails 会抱怨(应该如此)

<%= form_for @orderItem, url: {:action => :create} do |f| %>
    <p>
      <%= f.label :product_name %>
      <%= f.text_field :product_name %>
    </p>
    <%= f.submit %>
<% end %>

我的想法是让某人使用表单来创建订单项目。当他们选择分配给该订单项目的产品时,他们将从产品名称列表中选择一个名称(这是唯一的),然后当他们提交表单时,控制器检索适当的 Product 对象并分配其 ID到OrderItem

如何设置我的表单来完成此操作?

【问题讨论】:

    标签: ruby-on-rails forms ruby-on-rails-4


    【解决方案1】:

    听起来您想使用nested attributes。它们可让您在一个表单中同时保存有关 OrderItemProduct 的信息。

    在您的 OrderItem 中,添加行 accepts_nested_attributes_for :product

    然后在你的表单中你会想要这样的东西:

    <%= form_for @orderItem, url: {:action => :create} do |f| %>
        <p>
          <%= fields_for :product do |fp| %>
            <%= fp.label :product_name %>
            <%= fp.text_field :product_name %>
          <% end %>
        </p>
        <%= f.submit %>
    <% end %>
    

    (注意在 fields_for 块中使用 fp.label 而不是 f.label

    以上内容来自记忆,因此可能存在一些错误(您可能还需要更改 OrderItemsController 中的内容),但它应该为您提供一个起点。

    您可能会发现this Railscast 也很有帮助。

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多