动作'显示'找不到CommentsController如何处理这个?

时间:2018-01-07 20:42:34

标签: ruby-on-rails ruby

我搜索了许多其他帖子,但没有任何帮助我。所以我实现了一个多态的评论函数,这样每个人都可以评论每条评论。我的问题是,如果我创建一个评论,他就会要求一个show方法。

我的日志显示

 <properties>
      <owner>XYZ</owner>
 </properties>

我的routes.rb

Started POST "/comments/59/comments" for 127.0.0.1 at 2018-01-07 21:15:40 
+0100
 Processing by CommentsController#create as HTML
   User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? 
 ORDER 
 BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
   Comment Load (0.0ms)  SELECT  "comments".* FROM "comments" WHERE 
 "comments"."id" = ? LIMIT ?  [["id", 59], ["LIMIT", 1]]
    (0.5ms)  begin transaction
   Comment Load (0.0ms)  SELECT  "comments".* FROM "comments" WHERE 
  "comments"."id" = ? LIMIT ?  [["id", 59], ["LIMIT", 1]]
   SQL (1.0ms)  INSERT INTO "comments" ("body", "created_at", "updated_at", 
 "user_id", "commentable_id", "commentable_type") VALUES (?, ?, ?, ?, ?, ?)  
 [["body", "huihuihuihuihuihio"], ["created_at", "2018-01-07 
 20:15:40.254229"], ["updated_at", "2018-01-07 20:15:40.254229"], 
 ["user_id", 1], ["commentable_id", 59], ["commentable_type", "Comment"]]
    (89.3ms)  commit transaction
    (0.0ms)  begin transaction
    (0.0ms)  commit transaction
 Redirected to http://localhost:3000/comments/60
 Completed 302 Found in 118ms (ActiveRecord: 91.3ms)


 Started GET "/comments/60" for 127.0.0.1 at 2018-01-07 21:15:40 +0100

 AbstractController::ActionNotFound (The action 'show' could not be found 
 for CommentsController):

我的comments_controller.rb

resources :posts do 
  resources :comments 
end

resources :comments do
  resources :comments
end

我的评论.rb

class CommentsController < ApplicationController
before_action :find_commentable


def new
    @comment=Comment.new
end


def create 
    @comment =@commentable.comments.create(params[:comment].permit(:name, :body).merge(user: current_user))
    if @comment.save
        redirect_to comment_path(@comment), notice: 'Dein Kommentar wurde gespeichert'
    else
        redirect_to comment_path(@comment), notice: 'Dein Kommentar konnte leider nicht gespeichert werden, ueberpruefen sie ihre Eingaben'
    end
end

private

def find_commentable
    @commentable = Comment.find_by_id(params[:comment_id]) if params[:comment_id]
    @commentable = Post.find_by_id(params[:comment_id]) if params[:post_id]
end
end

说实话,我在删除帖子和posts_controller.rb方面遇到同样的问题。我已经修复了#34;它给show方法提供了与我的delete方法相同的代码。 因此,如果您有想法或需要更多代码,请告诉我

修改 Post.rb

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
  belongs_to :user

  has_many :comments, as: :commentable
end

Post_controller

class Post < ApplicationRecord
belongs_to :user, optional: true
has_many :comments, as: :commentable, dependent: :destroy

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

 has_attached_file :image  #, :styles => { :medium => "300x300>", :thumb => 
"100x100>" }
 validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
end

1 个答案:

答案 0 :(得分:0)

您的评论控制器中没有AsyncTask操作,但您说show要求服务器提供默认路径“/ comments / 60”。您为路由提供了资源,因此服务器期望该路由等于show动作。您应该查看所有路线,以便更好地了解正在发生的事情。约定优于配置的想法是假设这些默认值,直到您覆盖它们。当你redirect_to comment_path(@comment)时,你期望发生什么?

在浏览器中尝试使用此路径,插入您的应用名称:

redirect_to comment_path(@comment)

这将显示服务器的期望。如果需要解释,可以将结果添加到您的问题中。但基本上您需要将该操作添加到控制器,或者告诉控制器在操作完成时呈现其他内容。在该行动完成后你想看到什么?

如果您不想进行http://localhost/your_app_name/rails/info/routes. 操作,可以执行以下操作:

show

从下面可以清楚地看出,您的Post Controller没有redirect_to post_path(@comment.commentable_id) 动作。从您添加的代码中可以看出您已完成此操作?另外,如果上面提到的show无效,因为没有与redirect...关联的post_id,那么您还有其他更深层次的问题。大多数问题都源于你使用标准的东西,比如

@comment

然后做非标准的事情,比如没有每个控制器的标准CRUD操作。是的,你可以跳过你不需要的东西,但Rails的重点是通过约定优于配置来帮助简化事情。

修改

resources :posts do resources :comments end 更改为post_id,因为这是代码中引用的方式。这可能有效,但由于您允许对评论发表评论,因此可能不会。基本上,如果评论属于属于Post的评论,那么您必须向上遍历该树,或者只是像您选择的那样转到索引页面。