При попытке создать новый экземпляр он теряет соответствующий параметр, необходимый для этого - PullRequest
0 голосов
/ 07 июня 2018

Рельсы 5.1.6

У меня есть приложение, в котором перечислены товары, и вы можете добавить количество товара в заказ.Ну, это идея в любом случае.Итак, сейчас у меня есть форма, чтобы получить количество, а также захватить идентификатор продукта и идентификатор заказа, чтобы связать их через таблицу order_items, которая также содержит количество.Похоже, что форма захватывает order_id и устанавливает его в параметре order_items.В этом случае 5. Порядок с идентификатором 5 существует в БД.Однако когда параметры передаются в .new, он передает пустой идентификатор?Что мне здесь не хватает?

ActiveRecord :: RecordNotFound (Не удалось найти ордер с 'id' =):

Форма ERB

<% @products.each do |product| %>
<div class="col s4">

  <h4><%= link_to product.name, product_path(product) %></h4>

  <%= form_for @order_item do |f| %>
    <%= f.hidden_field :order_id, value: @order.id %>
    <%= f.hidden_field :product_id, value: product.id %>
    <%= f.number_field :quantity, placeholder: "quantity" %>

    <span class="waves-effect waves-light btn"><%= f.submit "Add to order" %></span>

  <% end %>
</div>

Класс OrderItemsController

  def create
    @order = Order.find(params[:id])
    @item = @order.order_items.new(item_params)
    @order.save
    if @order.save
      flash[:notice] = "Your order has been added!"
      redirect_to orders_path
    else
      render :new
    end
  end

 def item_params
    params.require(:order_item).permit(:quantity, :product_id, :order_id)
 end

Терминал

Started POST "/order_items" for 127.0.0.1 at 2018-06-06 16:50:31 -0700
Processing by OrderItemsController#create as JS
Parameters: {"utf8"=>"✓", "order_item"=>{"order_id"=>"5", 
"product_id"=>"2", "quantity"=>""}, "commit"=>"Add to order"}
Order Load (0.2ms)  SELECT  "orders".* FROM "orders" WHERE 
"orders"."id" = $1 LIMIT $2  [["id", nil], ["LIMIT", 1]]
Completed 404 Not Found in 2ms (ActiveRecord: 0.2ms)

ActiveRecord::RecordNotFound (Couldn't find Order with 'id'=):

app/controllers/order_items_controller.rb:4:in `create'

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

В вашем случае есть по крайней мере три вещи: create action:

1) Одно из скрытых полей в вашей форме передает order_id в качестве параметра, вы должны использовать его, чтобы найти порядок следующим образом:

@order = Order.find(params[:order_item][:order_id])

2) Вы дважды вызываете save для экземпляра @order в действии: create.

3) Вы фактически вызываете save для переменной экземпляра @order, ноВы ни в коем случае не сохраняете переменную экземпляра @item.@item сохраняется при сохранении @order?

Так что я бы попробовал следующее:

def create
  @order = Order.find(params[:order_item][:order_id])

  # how come you don't save this? You instantiate it but don't appear to call save at any point.
  @item = @order.order_items.new(item_params)

  # remove the following line, which I've commented out:
  # @order.save

  # Consider whether you wish to save @order or @item, or both
  if @order.save
    flash[:notice] = "Your order has been added!"
    redirect_to orders_path
  else
    render :new
  end
end

Надеюсь, это поможет, удачи

0 голосов
/ 07 июня 2018

Здесь:

@order = Order.find(params[:id])

Вы находите по params[:id].Но смотри!

Parameters: {"utf8"=>"✓", "order_item"=>{"order_id"=>"5", "product_id"=>"2", "quantity"=>""}, "commit"=>"Add to order"}

Нет params[:id].Однако у вас есть params[:order_item][:order_id].Возможно, вы намеревались использовать это?

Кроме того, вы можете упростить ваше действие create:

def create
  @order_item = OrderItem.new(item_params)
  if @order_item.save
    flash[:notice] = "Your order has been added!"
    redirect_to orders_path
  else
    render :new
  end
end

Учитывая, что у вас есть все атрибуты order_item в ваших параметрах:

"order_item"=>{"order_id"=>"5", "product_id"=>"2", "quantity"=>""}

Нет реальной необходимости искать @order (если вы не чувствуете себя в поясах и подтяжках).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...