0

I am learning rails by following the rails 3 guide.

The blog application have ran now,however I want to make the comment editable,and make the update ,create form both in the post show page. so I make the following modifiation:

post.show.htm.erb:

<h2>Comments</h2>
<% @post.comments.each do |comment| %>
  <tr>
    <td><%= comment.commenter %></td>
    <td><%= comment.body %></td>
    <td><%= link_to 'Edit', edit_post_comment_path(@post,comment) %></td>
    <td><%= link_to 'Destroy', post_comment_path(@post,comment), confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
</table>

<h2>Add a comment:</h2>

#here,I can not set the form_for property.
<%= form_for([@post,@comment],:url=>post_comment_path) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

The controller controller:

class CommentsController < ApplicationController
  # GET /posts/1/comments/1/edit
  def edit
    #render json: params
    @post=Post.find(params[:post_id])
    @comments=Comment.all
    @comment = Comment.find(params[:id])
    render "/posts/show"
  end

  #other action omitted

  def show
    # I donot know what to do here
  end
end

However I can not access the link:

http://localhost:3000/posts/1

I get the error:

No route matches {:action=>"show", :controller=>"comments"}

In fact,as you can see I have the show action in CommentController.

And,I wonder why it will access the comments#show action?

This is my routes:

    post_comments GET    /posts/:post_id/comments(.:format)          comments#index
                  POST   /posts/:post_id/comments(.:format)          comments#create
 new_post_comment GET    /posts/:post_id/comments/new(.:format)      comments#new
edit_post_comment GET    /posts/:post_id/comments/:id/edit(.:format) comments#edit
     post_comment GET    /posts/:post_id/comments/:id(.:format)      comments#show
                  PUT    /posts/:post_id/comments/:id(.:format)      comments#update
                  DELETE /posts/:post_id/comments/:id(.:format)      comments#destroy
            posts GET    /posts(.:format)                            posts#index
                  POST   /posts(.:format)                            posts#create
         new_post GET    /posts/new(.:format)                        posts#new
        edit_post GET    /posts/:id/edit(.:format)                   posts#edit
             post GET    /posts/:id(.:format)                        posts#show
                  PUT    /posts/:id(.:format)                        posts#update
                  DELETE /posts/:id(.:format)                        posts#destroy
       home_index GET    /home/index(.:format)                       home#index
             root        /                                           home#index

The /posts/:id will trigger posts#show. why comments#show?

4

1 回答 1

0

如果您需要编辑帖子,请添加

def edit
  @post = Post.find(params[:id])
end

def update
  @post = Post.find(params[:id])
  if @post.update_attributes(params[:post])
    redirect_to some_path and return
  end
  render 'edit' #error
end

编辑表单应向服务器发送 PUT 请求。rails 使用路由文件将 url 和请求(如 GET/POST/PUT/DELETE)映射到控制器操作。

这里

PUT    /posts/:id(.:format)                        posts#update

请求是 PUT,控制器是 PostsController,动作是更新。

还,

post GET    /posts/:id(.:format)                        posts#show

如果它的 POST/PUT/DELETE,你需要从表单传递 http 请求。你可以这样做'编辑'

<%= form_for([@post,@comment],:url=>post_comment_path, :method => :put) do |f| %>

映射到 PostsController 的显示请求。格式默认为 html。有关更多信息,请详细查看服务器日志。

于 2012-09-06T09:31:04.757 回答