如何提交Feed的多态注释?

如果用户单击[+注释]按钮

在此处输入图像描述

他面对这个邪恶的野兽:

ActiveRecord::RecordNotFound in CommentsController#create Couldn't find Comment with 'id'= Line: @commentable = resource.singularize.classify.constantize.find(id) 

活动/指数

     

评论/ _form

     Comment   

activities_controller

 def index @activities = Activity.order("created_at desc").where(user_id: current_user.following_ids) @commentable = @activity @comment = Comment.new end 

错误可以在这里找到:

 class CommentsController < ApplicationController before_action :load_commentable before_action :set_comment, only: [:show, :edit, :update, :destroy, :like] before_action :logged_in_user, only: [:create, :destroy] def index @comments = @commentable.comments end def new @comment = @commentable.comments.new end def create @comment = @commentable.comments.new(comment_params) if @comment.save redirect_to @commentable, notice: "comment created." else render :new end end def edit @comment = current_user.comments.find(params[:id]) end def update @comment = current_user.comments.find(params[:id]) if @comment.update_attributes(comment_params) redirect_to @commentable, notice: "Comment was updated." else render :edit end end def destroy @comment = current_user.comments.find(params[:id]) @comment.destroy redirect_to @commentable, notice: "comment destroyed." end def like @comment = Comment.find(params[:id]) @comment_like = current_user.comment_likes.build(comment: @comment) if @comment_like.save @comment.increment!(:likes) flash[:success] = 'Thanks for liking!' else flash[:error] = 'Two many likes' end redirect_to(:back) end private def set_comment @comment = Comment.find(params[:id]) end def load_commentable resource, id = request.path.split('/')[1, 2] @commentable = resource.singularize.classify.constantize.find(id) #Here it is! end def comment_params params[:comment][:user_id] = current_user.id params.require(:comment).permit(:content, :commentable, :user_id, :like) end end 

错误来自这里的答案: 如何添加多态注释到Feed?

development.log

 Started POST "/comments" for ::1 at 2015-04-23 20:12:14 -0400 Processing by CommentsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"hU1lxg2BMqSyBo8j2SGiEB4wZ3ez5kz/E64mp6ssbwBnh+DddyTtNQxY+IYCluHHvs2wIBxrtD5hQVA5sGtXBg==", "comment"=>{"content"=>"test"}, "button"=>""} [1m[35mUser Load (0.2ms)[0m SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 2]] [1m[36mHabit Load (0.1ms)[0m [1mSELECT "habits".* FROM "habits" WHERE "habits"."user_id" = ?[0m [["user_id", 2]] [1m[35mHabit Load (2.5ms)[0m SELECT "habits".* FROM "habits" [1m[36mActsAsTaggableOn::Tag Load (0.3ms)[0m [1mSELECT "tags".* FROM "tags" WHERE (LOWER(name) = LOWER('ingrain'))[0m [1m[35mComment Load (0.3ms)[0m SELECT "comments".* FROM "comments" WHERE "comments"."id" = ? LIMIT 1 [["id", nil]] Completed 404 Not Found in 16ms ActiveRecord::RecordNotFound (Couldn't find Comment with 'id'=): app/controllers/comments_controller.rb:61:in `load_commentable' 

非常感谢!

问题是,为了使其工作,看起来它被设置为注释成为您在路由文件中评论的任何内容的嵌套资源

所以,如果你想要对活动发表评论,你需要:

 resources :activites do resources :comments end 

这样,当#load_commentable方法选择请求路径时,它将从前两个段获得可注释和id。

相反,它看起来像是在尝试将注释用作顶级资源。

更新:当你调用partial时,只需传递表单应该使用的url helper。 像这样:

 <%= render "comments/form", new_comment: Comment.new(commentable_id: activity.id, commentable_type: activity.class.model_name), create_url: :activity_comments_path %> 

然后,在部分中,只需调用该帮助程序并将结果作为url选项传递 – 如下所示:

 <%= form_for new_comment, url: send(create_url, new_comment.commentable) 

load_commentable前的load_commentable ,如果@commentablenil ,您可以重定向到错误页面或其他@commentable 。 实际上,您正尝试在其他方法中访问此nil对象的属性(在此错误的情况下create )。