如何在使用 friendly_id 时 find_by_id (对于多态关系)
How to find_by_id when using friendly_id (for polymorphic relations)
How do I allow find_by_id to work so my comments will work with my posts that have slugs via friendly_id
? Is there an alternative approach to doing this?
我已经安装了一个名为 friendly_id
的 Ruby gem 并使用它在我的博文中创建了 slugs
。这些博文通过 polymorphic
关系获得评论。我有这些相互冲突的方法,我 认为 是我的评论不起作用并引发错误的原因:
undefined method 'comments' for nil:NilClass
指向创建方法中的@comment = @commentable.comments.new comment_params
评论控制器。
在我的评论模型中:
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
has_many :comments, as: :commentable, dependent: :destroy
end
在我的评论控制器中:
class CommentsController < ApplicationController
before_action :find_commentable
def new
@comment = Comment.new
end
def create
@comment = @commentable.comments.new comment_params
if @comment.save
flash[:success] = "Thanks for sharing your thoughts!"
redirect_back fallback_location: root_path
else
flash[:danger] = "There was an error posting your comment!"
redirect_back fallback_location: root_path
end
end
private
def comment_params
params.require(:comment).permit(:body, :email, :name)
end
def find_commentable
@commentable = Comment.find_by_id(params[:comment_id]) if params[:comment_id]
@commentable = Post.find_by_id(params[:post_id]) if params[:post_id]
end
end
在我的Post模型中:has_many :comments, as: :commentable
我的路线:
resources :comments do
resources :comments
end
我的服务器日志:
app/controllers/comments_controller.rb:9:in `create'
Started POST "/posts/top-5-audio-industry-blogs/comments" for 127.0.0.1 at 2018-06-30 10:35:09 -0300
Processing by CommentsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"[token]", "comment"=>{"body"=>"Hey, thanks for checking out the article! Any questions? Just ask me here and I'll be happy to help.", "name"=>"name", "email"=>"email", "nickname"=>""}, "commit"=>"Post Comment", "post_id"=>"top-5-audio-industry-blogs"}
Post Load (0.0ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ORDER BY "posts"."created_at" DESC LIMIT [["id", 0], ["LIMIT", 1]]
Completed 500 Internal Server Error in 27ms (ActiveRecord: 6.0ms)
NoMethodError (undefined method `comment' for nil:NilClass):
这是我唯一能想到的导致此错误的原因,因为它没有任何问题。提前感谢您的帮助!
根据 docs,您需要查询 Comment
和 Post
模型,因为帖子有 slugs
而评论没有。见下文:
def find_commentable
@commentable = if params[:comment_id]
Comment.find_by_id(params[:comment_id])
elsif params[:post_id]
Post.friendly.find(params[:post_id])
end
# You should also handle the case if `@commentable` is `nil` after above.
redirect_to somewhere, error: 'Post/Comment not found' unless @commentable
end
How do I allow find_by_id to work so my comments will work with my posts that have slugs via
friendly_id
? Is there an alternative approach to doing this?
我已经安装了一个名为 friendly_id
的 Ruby gem 并使用它在我的博文中创建了 slugs
。这些博文通过 polymorphic
关系获得评论。我有这些相互冲突的方法,我 认为 是我的评论不起作用并引发错误的原因:
undefined method 'comments' for nil:NilClass
指向创建方法中的@comment = @commentable.comments.new comment_params
评论控制器。
在我的评论模型中:
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
has_many :comments, as: :commentable, dependent: :destroy
end
在我的评论控制器中:
class CommentsController < ApplicationController
before_action :find_commentable
def new
@comment = Comment.new
end
def create
@comment = @commentable.comments.new comment_params
if @comment.save
flash[:success] = "Thanks for sharing your thoughts!"
redirect_back fallback_location: root_path
else
flash[:danger] = "There was an error posting your comment!"
redirect_back fallback_location: root_path
end
end
private
def comment_params
params.require(:comment).permit(:body, :email, :name)
end
def find_commentable
@commentable = Comment.find_by_id(params[:comment_id]) if params[:comment_id]
@commentable = Post.find_by_id(params[:post_id]) if params[:post_id]
end
end
在我的Post模型中:has_many :comments, as: :commentable
我的路线:
resources :comments do
resources :comments
end
我的服务器日志:
app/controllers/comments_controller.rb:9:in `create'
Started POST "/posts/top-5-audio-industry-blogs/comments" for 127.0.0.1 at 2018-06-30 10:35:09 -0300
Processing by CommentsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"[token]", "comment"=>{"body"=>"Hey, thanks for checking out the article! Any questions? Just ask me here and I'll be happy to help.", "name"=>"name", "email"=>"email", "nickname"=>""}, "commit"=>"Post Comment", "post_id"=>"top-5-audio-industry-blogs"}
Post Load (0.0ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ORDER BY "posts"."created_at" DESC LIMIT [["id", 0], ["LIMIT", 1]]
Completed 500 Internal Server Error in 27ms (ActiveRecord: 6.0ms)
NoMethodError (undefined method `comment' for nil:NilClass):
这是我唯一能想到的导致此错误的原因,因为它没有任何问题。提前感谢您的帮助!
根据 docs,您需要查询 Comment
和 Post
模型,因为帖子有 slugs
而评论没有。见下文:
def find_commentable
@commentable = if params[:comment_id]
Comment.find_by_id(params[:comment_id])
elsif params[:post_id]
Post.friendly.find(params[:post_id])
end
# You should also handle the case if `@commentable` is `nil` after above.
redirect_to somewhere, error: 'Post/Comment not found' unless @commentable
end