Ruby on rails 当尝试创建新实例时,它将';s正在丢失执行此操作所需的关联参数
轨道5.1.6 我有一个应用程序,上面列出了产品,你可以在订单中添加一定数量的产品。好吧,这就是我的想法。所以,现在我有一个表单来获取数量,还获取产品id和订单id,通过order_items表将它们关联起来,order_items表也保存了数量。看起来表单正在抓取order\u id并在order\u items参数中进行设置。在这种情况下,5。db中不存在id为5的订单。当参数传递给.new时,它传递的是一个空白id?我错过了什么 ActiveRecord::RecordNotFound(找不到id为的订单):Ruby on rails 当尝试创建新实例时,它将';s正在丢失执行此操作所需的关联参数,ruby-on-rails,ruby,forms,activerecord,Ruby On Rails,Ruby,Forms,Activerecord,轨道5.1.6 我有一个应用程序,上面列出了产品,你可以在订单中添加一定数量的产品。好吧,这就是我的想法。所以,现在我有一个表单来获取数量,还获取产品id和订单id,通过order_items表将它们关联起来,order_items表也保存了数量。看起来表单正在抓取order\u id并在order\u items参数中进行设置。在这种情况下,5。db中不存在id为5的订单。当参数传递给.new时,它传递的是一个空白id?我错过了什么 ActiveRecord::RecordNotFound(找
<% @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>
终点站
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'
在这里:
您正在通过参数[:id]
进行查找。但是你看
Parameters: {"utf8"=>"✓", "order_item"=>{"order_id"=>"5", "product_id"=>"2", "quantity"=>""}, "commit"=>"Add to order"}
无参数[:id]
。但是,您确实有参数[:order\u item][:order\u id]
。也许你打算用这个
此外,您还可以简化创建操作:
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\u项
属性:
"order_item"=>{"order_id"=>"5", "product_id"=>"2", "quantity"=>""}
没有真正的需要去寻找@订单
(除非你对事物感到紧张) 您的:创建操作至少有三个问题:
1) 表单中的一个隐藏字段将order_id作为参数传入,您应该使用它来查找顺序,如下所示:
@order = Order.find(params[:order_item][:order_id])
2) 在:create操作中对@order
实例调用save两次
3) 实际上,您正在对@order
实例变量调用save,但在任何时候都不保存@item
实例变量。保存@order
时是否保存@item
因此,我将尝试以下方法:
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
希望有帮助,祝你好运
@order = Order.find(params[:order_item][:order_id])
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