Rails 5: Displaying form from Joined table

最后都变了- 提交于 2019-12-06 08:57:52

To display each order and the quanties for each all you need to do is just a nested iteration:

<% user.orders.each do |order| %>
  <div class="order"> 
    <p>Ordered at <%= order.created_at %></p>
    <% order.quantites.each do |q| %>
    <div class="quantity"> 
       <%= q.meal.name >: <%= q.quantity %>
    </div>
    <% end %>
  </div>
<% end %>

You also have accepts_nested_attributes on the wrong model. It should be:

class Order < ApplicationRecord
  belongs_to :user
  has_many :quantities
  has_many :meals, through: :quantities
  accepts_nested_attributes_for :quantities
end

This lets you create nested quantities when along with an order:

Order.create(quantities_attributes: [{ meal_id: 1, quantity: 2 }, { meal_id: 3, quantity: 1 }])

You would setup the nested form like so:

<%= form_with(@order) do |f| %>
  <%= fields_for :quantities do |qf| %>
  <div class="quantity">
    <div class="field">
      <%= qf.label :meal_id %>
      <%= qf.collection_select :meal_id, Meal.all, :id, :name %>
    </div>
    <div class="field">
      <%= qf.label :quantity %>
      <%= qf.number_field :quantity %>
    </div>
  </div>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

And the controller:

class OrdersController < ApplicationController

  before_action :set_order, only: [:show, :edit, :update, :destroy]

  def new
    @order = Order.new
    # this seeds the form with fields for quantities
    10.times { @order.quantities.new }
  end

  def create
    # I'm assuming you have a current_user method
    @order = current_user.orders.new(order_params)
    if @order.save
      redirect_to 'somewhere'
    else
      render :new
    end
  end

  def update
    # I'm assuming you have a current_user method
    if @order.update(order_params)
      redirect_to 'somewhere'
    else
      render :new
    end
  end

  private
    def set_order
      @order = Order.find(params[:order_id])
    end

    def order_params
      params.require(:order).permit(:foo, :bar, quantities_attributes: [:meal_id, :quantity])
    end
end
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!