如何为has_and_belongs_to_many关联创建新项?

时间:2013-06-19 07:49:47

标签: ruby-on-rails

我的模型设置如下:

商品 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>

1 个答案:

答案 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变量的实例。请记住,您的路由不希望传递任何参数,因此您需要在传递变量时处理这两个实例,并且在传递变量时也需要处理。