2015-04-22 226 views
6

我有嵌套資源如下:Rails的:路線傭工嵌套資源

resources :categories do 
    resources :products 
end 

按照Rails Guides

你也可以用一組對象的使用url_for,和Rails自動將確定你想要哪條路線:

<%= link_to 'Ad details', url_for([@magazine, @ad]) %> 

在這種情況下,Rails會看到@magazine是一本雜誌,@ad是n Ad,因此將使用magazine_ad_path幫助程序。在這樣的link_to助手,你可以代替全url_for調用僅指定對象:

<%= link_to 'Ad details', [@magazine, @ad] %> 

進行其他操作,你只需要插入動作名稱作爲數組的第一個元素:

<%= link_to 'Edit Ad', [:edit, @magazine, @ad] %> 

在我的情況,我有以下的代碼這是完全正常:

<% @products.each do |product| %> 
    <tr> 
    <td><%= product.name %></td> 
    <td><%= link_to 'Show', category_product_path(product, category_id: product.category_id) %></td> 
    <td><%= link_to 'Edit', edit_category_product_path(product, category_id: product.category_id) %></td> 
    <td><%= link_to 'Destroy', category_product_path(product, category_id: product.category_id), method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 

顯然,這是一個有點過於版本玻色,我想用導軌上面提到的技巧縮短它。

但是,如果我改變了顯示編輯鏈接如下:

<% @products.each do |product| %> 
    <tr> 
    <td><%= product.name %></td> 
    <td><%= link_to 'Show', [product, product.category_id] %></td> 
    <td><%= link_to 'Edit', [:edit, product, product.category_id] %></td> 
    <td><%= link_to 'Destroy', category_product_path(product, category_id: product.category_id), method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 

兩個人都沒有工作多提了,該頁面抱怨同樣的事情:

NoMethodError in Products#index 
Showing /root/Projects/foo/app/views/products/index.html.erb where line #16 raised: 

undefined method `persisted?' for 3:Fixnum 

什麼我錯過了嗎?

+2

如果你做'[product,product.category]'('Show'url),它會工作嗎? –

回答

5

Rails的方式是'自動'知道要使用的路徑是通過檢查您爲其類傳遞的對象,然後查找名稱匹配的控制器。所以你需要確保你傳遞給link_to幫手的是實際的模型對象,而不是像category_id這只是一個fixnum,因此沒有關聯的控制器。

<% @products.each do |product| %> 
    <tr> 
    <td><%= product.name %></td> 
    <td><%= link_to 'Show', [product.category, product] %></td> 
    <td><%= link_to 'Edit', [:edit, product.category, product] %></td> 
    <td><%= link_to 'Destroy', [product.category, product], method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 
+1

謝謝你的解釋完全合理!前兩個完美,除了最後一個,它應該是'<%= link_to'Destroy',[product.category,product],方法:: delete,data:{confirm:'你確定嗎? }%>,否則它會轉到不存在的** delete_category_product_path **。 – jwong

+1

Doh!編輯反映! –

4

我猜出錯的行就是其中之一:

<td><%= link_to 'Show', [product, product.category_id] %></td> 
<td><%= link_to 'Edit', [:edit, product, product.category_id] %></td> 

product.category_idFixnum和路由無法知道一個隨機數應該映射到category_id

使用以前的URL,它們更具可讀性。