Передать параметры с помощью form_tag - PullRequest
0 голосов
/ 13 ноября 2018

На мой взгляд, у меня есть форма и пытается обновить количество для строки заказа:

<div class="quantity">Quantity</br> 
    <%= form_tag(order_line_path(line.id), method: "patch") do  %>
        <%= number_field_tag 'qty', '1', within: 1...line.book.stock %>
        <%= submit_tag "Update", class: "btn btn-primary" %>
    <% end %>
</div>

Переменная экземпляра в остальной части моего представления представляет собой набор строк заказа, поэтому я не могу ее использовать.

Тогда у меня в контроллере есть метод обновления:

def update
  @order = current_order
  @order_line = @order.order_lines.find(params[:id])
  @order_line.update_attributes(order_line_params)
end

И мое сильное определение параметров:

def order_line_params
  params.require(:order_line).permit(:qty)
end

Я получаю эту ошибку:

param is missing or the value is empty: order_line

Может кто-нибудь, пожалуйста, взгляните?

Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

Причина, по которой вы получаете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...