我正在尝试按照以下指南启动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>
不确定它是什么。请指教。如果需要,我会提供更多代码。
答案 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
页面。它会起作用。