【问题标题】:Nested forms: How to correctly access a certain instance with fields_for嵌套表单:如何使用 fields_for 正确访问某个实例
【发布时间】:2023-03-07 17:35:01
【问题描述】:

我有一个订单,它总是有两个地址:一个发票地址和一个送货地址。在视图中,我有一个表单,您可以在其中输入两个地址。从我的控制器中,我传递了实例 @order,其中已经构建了两个 addresses 的子实例。

从我的 OrdersConnroller 中提取:

def new
  @order = Order.new(orderCreationDate: Time.now)
  2.times{ @order.addresses.build }
end

在视图中,我怎样才能只访问第一个@order.addresses,然后在其他地方访问第二个@order.addresses?

到目前为止我已经尝试过:

<%= form_for @order do |f| %>
...
  <%= f.fields_for :addresses do |ff| %>
   <%= ff.text_field :firstName %> 
  ...
  <% end %>
<% end %>

但是 HTML 结果如下(其中名称和 ID 不正确)。

<input type="text" name="order[a][firstName]" id="order_a_firstName">      

从我的 Order 模型中提取:

has_many :addresses, foreign_key: "orderID"
accepts_nested_attributes_for :addresses, allow_destroy: true

感谢支持。

【问题讨论】:

    标签: ruby-on-rails nested-forms


    【解决方案1】:

    您需要创建两个模型 1) InvoiceAddress 和 2) ShippingAddress

    class InvoiceAddress < ActiveRecord::Base
       self.table_name = :address
    end
    
    class ShippingAddress < ActiveRecord::Base
       self.table_name = :address
    end
    

    按顺序模型使用关联如下

    has_one :invoice_address
    has_one :shipping_address
    

    和orders_controller.rb

    def new
      @order = Order.new(orderCreationDate: Time.now)
      @invoice_address = @order.build_invoice_address
      @shipping_address = @order.build_shipping_address
    end
    

    表格将是

    <%= form_for @order do |f| %>
       ...
       <%= f.fields_for :invoice_address, @invoice_address  do |ff| %>
          <%= ff.text_field :firstName %> 
          ...
       <% end %>
       <%= f.fields_for :shipping_address, @shipping_address  do |ff| %>
          <%= ff.text_field :firstName %> 
          ...
       <% end %>
    <% end %>
    

    【讨论】:

    • 嗨 Ganesh,我知道你是如何解决这个问题的。但是,如果我尝试保存订单并且对其中一个地址的验证失败怎么办?如何确保只有在所有验证都通过时才保存所有 3 个实例(否则应该回滚)?
    • 验证也可以使用上述方法,试试吧。
    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2013-06-15
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多