我的模型设置如下:
商品 has_and_belongs_to_many BatchTicket
如何在BatchTicket控制器中定义@batch_ticket以创建新批量票证? 这不起作用:
class BatchTicketsController < ApplicationController
def new
@batch_ticket = item.batch_tickets.build
end
end
我不确定如何正确识别'item'。参数[]中没有任何内容。我把id放在下面的'li'中。
尝试创建新BatchTicket的代码(正确列出):
<h4>New Orders</h4>
<ul>
<% @items_to_plan.each do |item| %>
<li id="<%= item.id %>"><%= item.item_code %> <%= link_to "new", new_batch_ticket_path(item) %> |
<%= link_to "cmb", '#' %></li>
<% end %>
</ul>
我得到的错误是:
undefined local variable or method `item' for #<BatchTicketsController:0x007ff1bd48f808>
答案 0 :(得分:2)
将item
作为参数传递给new_batch_ticket_path
,您已通过item_id
隐式地将params[:item_id]
传递给您的控制器。使用它,您可以查找所需的相应Item
对象:
假设您正在使用RESTful路由,那么您的new_batch_ticket_path
不会期望收到任何参数。因此,您需要显式声明您作为GET变量传入的任何内容。在这种情况下,您应该将item.id
作为item_id
传递:
<%= link_to "new", new_batch_ticket_path(:item_id => item.id) %>
# app/controllers/batch_tickets_controller.rb
def new
if params[:item_id]
item = Item.find(params[:item_id])
@batch_ticket = item.batch_tickets.build
else
@batch_ticket = BatchTicket.create
end
end
注意if-else条件?您需要这样做才能处理新动作被调用而不传递GET item_id
变量的实例。请记住,您的路由不希望传递任何参数,因此您需要在传递变量时处理这两个实例,并且在传递变量时也需要处理。