0

我的模型设置如下:

项目has_and_belongs_to_many BatchTicket

如何在 BatchTicket 控制器中定义 @batch_ticket 以创建新的批量票证? 这不起作用:

class BatchTicketsController < ApplicationController
  def new
    @batch_ticket = item.batch_tickets.build
  end
end

我不确定如何正确识别“项目”。params[] 中没有任何内容。我已将 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>
4

1 回答 1

2

通过item作为参数传递给new_batch_ticket_path,您已经通过 . 隐式传递item_id给您的控制器params[:item_id]。使用它,您可以查找所需的相应Item对象:

假设您使用的是 RESTful 路由,您new_batch_ticket_path不希望收到任何参数。因此,您需要将传入的任何内容显式声明为 GET 变量。在这种情况下,您应该传递item.iditem_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 条件?您需要它来处理在传递 GETitem_id变量的情况下调用新操作的实例。请记住,您的路线不希望传递任何参数,因此您需要在传递变量时处理这两个实例,以及在没有传递变量时。

于 2013-06-19T07:52:20.967 回答