0

シンプルな在庫アプリを作成しています。「アイテム」を一覧表示するビューがあります。次の行を含むテーブルがあります。

<tr>
<td><%= item.title %></td>
<td><%= item.desc %></td>
<td><%= item.value %></td>
<td><%= item.room.name %></td>
<td><%= item.user.username %></td>
<td>
  <%= link_to 'View', item %>
  <%= link_to 'Edit', edit_item_path(item) %>
  <%= link_to 'Delete', item, method: :delete, data: { confirm: 'Are you sure?' } %>
  <%= link_to 'Add Comment', !?????! %>
</td>
/tr>

「コメント」設定用のリンク モデルがありますが'item_id'、新しいモデルを作成するときにモデルを渡す方法がわかりません。

4

2 に答える 2

2

URLヘルパーは、実際にオブジェクトを受け入れて、関連付けのルートを作成します。つまり、アイテム内にコメント用のネストされたルートがあると仮定すると、

resources :items do
  resources :comments
end

あなたはすることができlink_toますnew_item_comments_path(item)

このメソッドは、HTMLタグを作成するためにフィードするルートにnew_item_comments_path(item)基づいて文字列URLを作成します。new_item_commentslink_to<a>

より明確にするために、あなたの見解では次のようになります。

  <%= link_to 'View', item %>
  <%= link_to 'Edit', edit_item_path(item) %>
  <%= link_to 'Delete', item, method: :delete, data: { confirm: 'Are you sure?' } %>
  <%= link_to 'Add Comment', new_item_comments_path(item) #-> (instead of ???) %>

この場合、item渡すのは現在のアイテムへの参照です。これにより、URLヘルパーはルートからそのアイテムのURLを作成できます。

ルーティングのRailsガイドは、参考になるはずです。

これは、コメントコントローラが適切な場所に適切なものを割り当てることを前提としています。あなたはそれを理解しているように見えましたが、明確にするために(そして将来の訪問者のために)説明します

class CommentsController < ApplicationController
  # GET /item/:item_id/comments/new
  def new
    @comment = Comment.new

    @item = Item.find(params[:item_id])
    @comment.item = @item
    # render
  end

  # POST /item/:item_id/comments
  def create
    @comment = Comment.new(params[:comment])

    @item = Item.find(params[:item_id])
    @comment.item = @item

    # if @comment.save blah
  end
end
于 2012-12-03T00:00:36.190 に答える
0

すべてのクレジットは @jonalllard に送ってください

解決策はすべてルーティングに関するもので、新しいコメントを作成するフォーム (リンクされたモデル) に URL を渡す必要があります。

これをする:

  1. 作成を呼び出しているページにこれ (またはオブジェクト名に応じて同様のもの) を追加します。

    <%= link_to 'Add Comment', new_item_comment_path(@item) %>

  2. newと のcreateメソッドの両方に、comments_controllerから始まる行があり@comment = Comment.newます。その行の下に次を追加します。

    @item = Item.find(params[:item_id])@comment.item = @item

  3. のコメント テンプレートの先頭行を次のように編集します。<%= form_for(@comment, {:url => item_comments_path(@item)}) do |f| %>

  4. ルートを次のように編集します。

リソース :items do

...

リソース :コメント

終わり

これを読んでください:http://guides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects !

前に述べたように、すべての功績は @jonallard、彼の答えと専門知識に帰します。

于 2012-12-03T15:40:04.693 に答える