无法为CommentsController - Ruby Tutorial找到动作'show'

时间:2016-01-15 18:14:08

标签: ruby-on-rails ruby

我正在尝试按照以下指南启动Ruby on Rails。一切顺利,直到我试图销毁(删除评论)。

我收到以下错误: 无法为CommentsController

找到操作'show'

我将在下面发布我的代码。

http://guides.rubyonrails.org/getting_started.html

comments_controller.rb

class CommentsController < ApplicationController

  http_basic_authenticate_with name: "dhh", password: "secret", only: :destroy

    def create
        @article = Article.find(params[:article_id])
        @comment = @article.comments.create(comment_params)
        redirect_to article_path(@article)
    end

    def destroy
        @article = Article.find(params[:article_id])
        @comment = @article.comments.find(params[:id])
        @comment.destroy
        redirect_to article_path(@article)
    end

    private
        def comment_params
          params.require(:comment).permit(:commenter, :body)
        end

end

articles_controller

class ArticlesController < ApplicationController

 http_basic_authenticate_with name: "dhh", password: "secret", except: [:index, :show]

    def index
       @articles = Article.all
    end

    def show
        @article = Article.find(params[:id])
    end

    def new
        @article = Article.new 
    end

    def edit
      @article = Article.find(params[:id])
    end

    def create
      @article = Article.new(article_params)

      if @article.save
        redirect_to @article
      else
        render 'new'
      end
    end

    def update
      @article = Article.find(params[:id])

      if @article.update(article_params)
        redirect_to @article
      else
        render 'edit'
      end
    end

    def destroy
      @article = Article.find(params[:id])
      @article.destroy

      redirect_to articles_path
    end

    private
      def article_params
        params.require(:article).permit(:title, :text)
      end
end

的routes.rb

Rails.application.routes.draw do

  resources :articles do
    resources :comments
  end

  root 'welcome#index'
end

article.rb

class Article < ActiveRecord::Base

    has_many :comments, dependent: :destroy

    validates :title, presence: true,
                      length: { minimum: 5}
end

comment.rb

class Comment < ActiveRecord::Base
  belongs_to :article
end

物品/ index.html.erb

<h1>Listing Articles</h1>

<%= link_to 'New article', new_article_path %>

<table>
  <tr>
    <th>Title</th>
    <th>Text</th>
    <th colspan="3"></th>
  </tr>

  <% @articles.each do |article| %>
    <tr>
      <td><%= article.title %></td>
      <td><%= article.text %></td>
      <td><%= link_to 'Show', article_path(article) %></td>
      <td><%= link_to 'Edit', edit_article_path(article) %></td>
      <td><%= link_to 'Destroy', article_path(article),
              method: :delete,
              data: { confirm: 'Are you sure?' } %></td>
    </tr>
  <% end %>
</table>

不确定它是什么。请指教。如果需要,我会提供更多代码。

6 个答案:

答案 0 :(得分:6)

答案将在您的routes.rb和您尝试呼叫的网址中。

网址可能是/comment/123,而routes.rb可能包含get 'comment/:id' => 'comment#show'(或resource评论声明)。

因此rails尝试显示页面以进行评论,但您没有实现该功能。错误消息确切地说明了它需要说明的内容(您的.show中确实没有CommentsController方法。)

如果我的猜测不正确,请发布您的routes.rb和您要求的网址。

答案 1 :(得分:1)

我一直在研究同一教程,直到今天才遇到与原始海报完全相同的问题。

我没有确切地知道它何时开始,但是它似乎已经在第6、7或8节中开始了(向博客添加评论,重构或添加评论删除)。

此外,点击应用内的链接(即“后退”链接)将产生一个新标签。同样,单击“销毁”链接时,浏览器的确认对话框将出现在当前选项卡上(行为正确),但同时会出现一个新的浏览器选项卡(不正确)-我认为这种新的选项卡行为(一种导致错误的原因是“显示用户正在决定是否继续销毁的评论”。

在完成本教程(另一节,基本身份验证)后,我退出并重新启动了Chrome,然后退出并重新启动了服务器(ctrl-c,然后是bin / rails服务器)。

这样做之后,一切都很好。当出现销毁确认单时,产生的额外选项卡行为以及被触发的虚假显示动作(从而导致错误)都已停止。

所以看来,这个问题仅仅是一些杂散的噪声-可能是由于在最初编写本教程的时间到最初的发帖人遇到这种行为(并且仍然持续存在)之间发生了某些变化(在Rails环境中?)引起的。今天(18年7月,使用5.2导轨)。

答案 2 :(得分:0)

您可以添加

def show
    @article = Article.find(params[:article_id])
    @comment = @article.comments.find(params[:id])
    @comment.destroy
    redirect_to article_path(@article)
end

comments_controller.rb

实际上这些代码与def destroy

中的代码相同

答案 3 :(得分:0)

添加评论模型 belongs_to :user 如果您对用户和其他人进行身份验证,无论您属于什么...

答案 4 :(得分:0)

我遇到了一些类似的问题,例如:

  • 尝试删除评论时出现相同的消息:
<块引用>

找不到 CommentsController 的动作“show”

  • 尝试删除文章时,它没有被删除,而是呈现其页面。

  • 既不删除文章也不删除评论时,确认对话框未显示。

我已尝试重新启动服务器以及上述解决方案之一,即创建与 show 方法相同的 destroy 方法。嗯,它可以很好地删除评论,但考虑到 RoR DRY 模式,我觉得这不合适。

我最终意识到负责阻止 JavaScript (NoScript 11.2.9) 的浏览器扩展程序处于活动状态并导致了那些奇怪的行为。

在这种特殊情况下,与Rails本身无关,而是与外部因素有关。

答案 5 :(得分:-2)

更新:正如我之前提到的,您show中没有CommentsController方法,因此您无法访问任何{{1}页面show 1}}。

正如您所说,您正在尝试访问此网址:comment这是localhost:3000/articles/2/comments/1的显示页面comment 1且路由(id:)正在尝试把它带到resources :comments行动。因此错误正确抛出show

请从您的浏览器中删除该网址,然后再次访问show could not be found for CommentsController article页面。它会起作用。