2012-12-02 50 views
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'傳遞給它。

回答

2

URL helpers實際上接受爲對象建立關聯的路線。這意味着,假設你有項目中的註釋嵌套的路線,

resources :items do 
    resources :comments 
end 

可以link_tonew_item_comments_path(item)

的方法new_item_comments_path(item)使得基於new_item_comments路線,你喂到link_to作出HTML <a>標籤上的字符串URL。

更清晰,在你看來,你將有:

<%= 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幫手做一個網址吧從路線。

Rails guide for routing應該對你有用。

現在,假設您的評論控制器在正確的位置分配正確的東西。你似乎已經想通了這一點,但我會爲清楚起見(以及未來的訪客)

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 
+0

什麼代替:'new_item_comments_path'到底是什麼?我期待它看起來更像:',item,method::add_comment ...'就像刪除函數一樣?我是否需要爲我的項目控制器添加一個'add_comment'方法? –

+0

實際上,'new_item_comments_path'幫手直接進入'Comment#new'控制器,所以不需要指定它。我鏈接到路由指南,這應該爲您解決一些問題。 –

+0

'new_item_comments_path(item)'給出'未定義的方法',但是'new_item_comment_path(item)'導致創建新的評論。但是,當我看着在軌道控制檯中的評論它顯示'item_id:nil'? –

0

所有信貸應該去@jonallard

該解決方案是所有關於路由似乎解釋,你需要傳遞一個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. 編輯路線,像出頭:

資源:項目做

...

資源:評論

和閱讀本:http://guides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects

如前所述,所有功勞歸功於@jonallard,他的回答和他的專業知識。