Problem with Getting Started with Rails

I am working through the official Getting Started with Rails tutorial
http://guides.rubyonrails.org/getting_started.html#generating%20-a-controller

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.

Neil B. wrote:

I am working through the official Getting Started with Rails tutorial
http://guides.rubyonrails.org/getting_started.html#generating%20-a-controller

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.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs