Problem with Getting Started with Rails

I am working through the official Getting Started with Rails tutorial

I am stuck on section 8.4 Generating a Controller. It suggests there that this definition: def index   @post = Post.find(params[:post_id])   @comments = @post.comments end

S ould be used in com ents_controller.rb. Surely that would make http://localhost:3000/comments work, but it gives the error Couldn't find Post without an ID. That suggests a problem with the first line of the definition. However that is what it says I should use in the tutorial so I looked at post.rb and comment.rb and they are as directed. Also checked routes.rb but all seems to be correct. Incidentally the page http://localhost:3000/posts/1 works fine and displays comments which I have to enter with the terminal as http://localhost:3000/comments/new gives the same error.

I have been tearing my hair out with this for 3 days. Can somebody please point out what I am doing wrong.

Attachments: http://www.ruby-forum.com/attachment/4577/index.html.erb

Neil Bye wrote:

I am working through the official Getting Started with Rails tutorial Getting Started with Rails — Ruby on Rails Guides

I am stuck on section 8.4 Generating a Controller. It suggests there that this definition: def index   @post = Post.find(params[:post_id])   @comments = @post.comments end

S ould be used in com ents_controller.rb. Surely that would make http://localhost:3000/comments work, but it gives the error Couldn't find Post without an ID. That suggests a problem with the first line of the definition. However that is what it says I should use in the tutorial so I looked at post.rb and comment.rb and they are as directed. Also checked routes.rb but all seems to be correct. Incidentally the page http://localhost:3000/posts/1 works fine and displays comments which I have to enter with the terminal as http://localhost:3000/comments/new gives the same error.

Take a closer look at this URL: http://localhost:3000/comments

How would the comments_controller know which post to look up. The resource identifier is not anywhere in the URL and it's not tacked on as a query parameter.

The most likely design in this case would be to nest comments under posts. The URL would look something like:

http://localhost:3000/posts/1/comments/new

And the new action would look something like:

  def new     @post = Post.find(params[:post_id])     @comment = @post.comments.build   end

If course you're going to want to DRY up this code by moving:

@post = Post.find(params[:post_id])

Into a private method and adding a before_filter to load the post.