【问题标题】:Rails 5 error: No route matches [DELETE] "/comments"Rails 5 错误:没有路线匹配 [DELETE] "/comments"
【发布时间】:2016-08-14 04:57:45
【问题描述】:

我目前正在尝试删除评论,就像在我的应用程序中删除帖子一样。但是,由于某种原因,完全相同的代码似乎不适用于我的 cmets 并返回以下错误:

没有路线匹配 [DELETE] "/cmets"

def destroy
   @post = @comment.post
   @comment.destroy
   respond_to do |format|
      format.html { redirect_to @post, notice: 'Comment was successfully destroyed.' }
      format.json { head :no_content }
   end
end

这是我的模型的样子:

class Comment < ApplicationRecord
    belongs_to :post
    belongs_to :user
end

这是我的路线的样子:

Rails.application.routes.draw do
   resources :posts
   resources :users
   resources :comments, only: [:create, :destroy]

   #signup and register workflow
   get '/signup' => 'users#new'
   get '/login' => 'sessions#new'
   post '/login' => 'sessions#create'
   delete '/logout' => 'sessions#destroy'
end

这是我的链接在我看来的样子(Slim):

   - @comments.each do |comment|
      .comment-container.level-0
        p 
        a href="/users/#{comment.user_id}" = comment.user.first_name
        | : 
        = comment.comment
        - if comment.user == current_user
          .icon-delete
            = link_to "Delete", comment, method: :delete, data: { confirm: 'Are you sure?' }
    end
    hr
    h3 Write a new comment
    = bootstrap_form_for(@comment) do |c|
      .field
        = c.text_field :comment
      .field
        = c.hidden_field :user_id, :value => current_user.id
        = c.hidden_field :post_id, :value => @post.id
      .actions
        = c.submit

【问题讨论】:

  • rake routes | grep comments 命令的输出是什么?
  • cmets POST /cmets(.:format) cmets#create comment DELETE /cmets/:id(.:format) cmets#destroy
  • @patrick 你能把代码贴在你的 routes.rb 文件中吗?
  • 如果您只有createdestroy 操作,如何渲染view 以创建新评论?可能在posts/new.html.erb 里面。那么comment 是一个嵌套资源,实际上范围为posts。没有postcomment 就无法存在。请参阅blog.8thcolor.com/en/2011/08/… 了解更多信息

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5


【解决方案1】:

我猜你只是错过了link_to 方法的格式:

= link_to "Delete", comment, method: :delete, data: { confirm: 'Are you sure?' }

应该是这样的:link_to(body, url, html_options = {}) 你错过了 body 部分。

查看here

编辑

当我发布这条评论时,我才意识到:如果我尝试这个,那么 错误是:nil:NilClass 的未定义方法 `post'

好的,问题是:当您单击链接时,它会转到destroy 方法。然后它尝试像@post = @comment.post 一样查询。正如您在发送comment 的链接中看到的那样。所以在destroy方法中你应该获取post这样的:

def destroy
   @comment = Comment.find(params[:id])
   @post = @comment.post
   @comment.destroy
   respond_to do |format|
      format.html { redirect_to @post, notice: 'Comment was successfully destroyed.' }
      format.json { head :no_content }
   end
end

那么你就可以走了。 :)

【讨论】:

  • 这个@comment 变量是从哪里来的?这是单个 Comment 对象还是一堆对象?
  • 此链接位于以下循环内:-@cmets.each 做 |comment|
  • 我刚刚意识到,当我发布这条评论时:如果我尝试这个,那么错误是:undefined method `post' for nil:NilClass
  • 实际上您的问题出在您创建评论的根目录中。我不知道您是如何创建 cmets 的,以及 post 和 cmets 之间的关系是什么。如果您发布关系和整个html 部分,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多