Причина, по которой вы получаете param is missing or the value is empty: order_line
, заключается в том, что вы используете form_tag
, который дает "плоский" хэш params.
Однако этого легко избежать, если вы просто используете form_with/form_for
.
# routes.rb
resources :orders do
resources :line_items, shallow: true
end
# app/views/order_items/edit.html.erb
# use `form_with(model: @order_item)` in Rails 5
<%= form_for(@order_item) do |f| %>
<%= f.label :qty, within: 1...f.object.book.stock %>
<%= f.number_field :qty, %>
<%= f.submit %>
<% end %>
class OrderItemsController < ApplicationController
before_action :set_order_item, only: [:show, :edit, :update, :destroy]
# ...
# GET /order_items/:id/edit
def edit
end
# PATCH /order_items/:id
def update
if @order_item.update(order_item_params)
redirect_to @order_item, notice: 'Line updated'
else
render :edit
end
end
private
def set_order_item
@order_item = OrderItem.find(params[:id])
end
def order_item_params
params.require(:order_item).permit(:qty)
end
end
Но то, что вы действительно ищете, если только выОбновление / создание вложенных элементов с помощью AJAX, скорее всего, представляет собой комбинацию accepts_nested_attributes
и fields_for
, которая позволит пользователю массово редактировать позиции:
class Order < ApplicationRecord
accepts_nested_attributes_for :order_items
end
<%= form_for(@order) do |f| %>
<%= fields_for(:order_items) do |oif| %>
<%= f.label :qty, within: 1...f.object.book.stock %>
<%= f.number_field :qty, %>
<% end %>
<%= f.submit %>
<% end %>
class OrdersController < ApplicationController
# PATCH /orders/:id
def update
if @order.update(order_params)
redirect_to @order, notice: 'Order updated.'
else
render :new
end
end
private
def order_params
params.require(:order).permit(order_items_attributes: [:qty])
end
end