使用Ruby on Rails创建博客-删除评论问题

9

由于我对Rails和编程一般都很陌生,请多包涵。提前感谢您的帮助。

我已经成功地完成了Ryan Bates在如何在15分钟内构建一个博客的初始教程。如果您不知道,这个教程会带你创建文章并允许评论这些文章。它甚至通过在文章show.html.erb页面上创建和显示评论来介绍AJAX。所有的工作都非常出色。

这里有一个小问题,当Ryan带领你完成这个教程时,他清空了comments_controller,并只展示了创建评论的代码。我正在尝试重新添加编辑和删除评论的功能。但似乎无法实现,它一直删除实际的文章而不是评论(日志显示我一直在向PostsController发送DELETE请求)。以下是我的代码:

class CommentsController < ApplicationController
 def create
   @post = Post.find(params[:post_id])
   @comment = @post.comments.create!(params[:comment])
   respond_to do |format|
     format.html { redirect_to @post }
     format.js
   end
 end

 def destroy
    @comment = Comment.find(params[:id])
    @comment.destroy

    respond_to do |format|
      format.html { redirect_to(posts_url) }
      format.xml  { head :ok }
    end
  end
end

/views/posts/show.html.erb

    <%= render :partial => @post %>

    <p>
        <%= link_to 'Edit', edit_post_path (@post) %> |
        <%= link_to 'Destroy', @post, :method => :delete, :confirm => "Are you sure?" %> |
        <%= link_to 'See All Posts', posts_path %>
    </p> 

    <h2>Comments</h2>
    <div id="comments">
        <%= render :partial => @post.comments %>
    </div>

    <% remote_form_for [@post, Comment.new] do |f| %>
        <p>
            <%= f.label :body, "New Comment" %><br/>
            <%= f.text_area :body %>
        </p>
        <p>

<%= f.submit "Add Comment" %></p>
<% end %>

/views/comments/_comment.html.erb

<% div_for comment do %>
    <p>
        <strong>Posted <%= time_ago_in_words(comment.created_at) %> ago
        </strong><br/>
        <%= h(comment.body) %><br/>
        <%= link_to 'Destroy', @comments, :method => :delete, :confirm => "Are you sure?" %>
    </p>
<% end %>

routes.rb

ActionController::Routing::Routes.draw do |map|
  map.resources :posts, :has_many => :comments
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

“看不到它能够工作” - 你实际尝试了什么来修复它? - user65663
我尝试将comment.html.erb中的link_to更改为@comment、comment、comments等。我还尝试通过更改CommentsController的destroy动作,将@comment = Comment.find(params[:id])更改为包括@post.comment.destroy(params[:comment_id])。还尝试了其他几个方法,但似乎要么我在routes.rb文件中没有做正确的事情,要么是comments.html.erb中的link_to不对。我会更新以包括路由代码。 - bgadoci
2个回答

12

meagar 的想法正确,但由于这是嵌套路由,你必须这样做:

<%= link_to 'Destroy', [@post, comment], ... %>

因此,你需要传递评论和文章,并让 Rails 根据你的定义确定路由。


谢谢。看来我尝试了每种组合,但这个完美地起作用了。 - bgadoci

1
_comments.html.erb 文件中,将你的 link_to 改为:
<%= link_to 'Destroy', comment, ... %>

即传递给它comment本身,而不是整个@comments数组。


当我这样做时,我会收到以下错误:undefined method `comment_path' for #ActionView::Base:0x10431fc68 - bgadoci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接