0

次のようにモデルを設定しています。

アイテムhas_and_belongs_to_many BatchTicket

新しいバッチ チケットを作成するために、BatchTicket コントローラーで @batch_ticket を定義するにはどうすればよいですか? これは機能しません:

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

「アイテム」を正しく識別する方法がわかりません。params[]には何もありません。以下に示す「li」にIDを入れました。

新しい 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.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ルートは引数が渡​​されることを想定していないため、変数が渡される場合と渡されない場合の両方のインスタンスを処理する必要があることに注意してください。

于 2013-06-19T07:52:20.967 に答える