I’m trying to get back into rails after a while and am having a tough time connecting two simple scaffold-built resources in a nested fashion. The parent controller works, but the child usually blows up. I’ve been looking all over for an answer to this problem, but haven’t succeeded.
For a specific comment child belonging to a product parent, route “/products/1/comments/1”
Error message
Couldn’t find Comment without an ID
app/controllers/comments_controller.rb:25:in `show’Parameters:
{“product_id”=>”1”,
“id”=>”1”}
Here’s the relevant code from comments_controller “show”
def show
@product = Product.find(params[:product_id])
@comment = @product.comments.find(params[:comment_id])
(If I change :comment_id to just :id the new error is:)
Couldn’t find Comment with ID=1 [WHERE (
comments.product_id = 1)]{“product_id”=>”1”,
“id”=>”1”}
For comment index: /products/1/comments
Error info:
undefined method `model_name’ for Fixnum:Class
Parameters:
{“product_id”=>”1”}
** Relevant code from index view **
18: <td><%= link_to 'Show', [@product, comment.id] %></td>
19: <td><%= link_to 'Edit', edit_product_comment_path(@product, comment) %></td>
20: <td><%= link_to 'Destroy', [@product, comment], :confirm => 'Are you sure?', :method => :delete %></td>
I’ve spent a couple days messing with this to no avail. Been checking simple things like :id to :(noun)_id as well as switching between [@product, comment] and [@product, comment.id] in my view links.
Any suggestions are greatly appreciated on how to get this working. It seems like it should be simple, and I pretty much followed the “book.” The trouble with this is that my rails texts (The Rails way and a little ruby intro book with a couple chapters on rails) are based on rails 2 at best, and web resources haven’t been entirely updated.
Updates:
*Routes.rb*
Party2::Application.routes.draw do
resources :comments
resources :products do
resources :comments
end
Errors from comment index
undefined method `model_name’ for Fixnum:Class
Relevant code from comment index (Error at line 18)
18: <td><%= link_to 'Show', [@product, comment.id] %></td>
19: <td><%= link_to 'Edit', edit_product_comment_path(@product, comment) %></td>
20: <td><%= link_to 'Destroy', [@product, comment], :confirm => 'Are you sure?', :method => :delete %></td>
Another update:
*Models*
class Product < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :product
end
Thanks again,
Cameron
(Seems very strange to me that this shouldn’t work, as I’ve been following tutorials. :/)
If a comment can belong to only one product, you should be able to do something like this in the comments_controller.rb: