我在我的rails应用上安装了FriendlyID。我已按照此问题https://github.com/norman/friendly_id/issues/700的说明进行操作,并根据第一个选项更改了我的链接。
# before: admin_post_path(@post)
link_to admin_post_path(@post.id)
到目前为止一直很好,但是当我尝试提交_form时,我收到以下错误
Couldn't find Post with 'id'=hello-world
经过一些调试后我发现这是因为我还从Post.find中删除了.friendly方法,所以:
def set_post
# before: Post.friendly.find(params[:id])
@post = Post.find(params[:id])
end
所以当我把它放回去时,一切正常。但是,这会生成一个额外的查询,用于获取slug,如您所知
Post Load (0.3ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`slug` = '1' LIMIT 1
Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 1 LIMIT 1
现在我的问题是:有没有办法让@post = Post.find(params[:id])
保持set_post
并删除这个额外的查询?请记住,我希望这仅适用于Admin命名空间,因此在前端链接应该使用友好ID和slugs
答案 0 :(得分:0)
您正在查看两个查询,因为这样可以确定FriendlyId的find
方法是如何工作的。对于数字字符串,它首先会进行友好查找,然后再回到常规查找。
查看the source(以及优秀的评论),您可以看到有一种解决方法 - 我们可以使id
"不友好"。
Here's a list of things被视为"不友好"。在这种情况下,您可以通过自己将params[:id]
转换为整数值来删除额外查询:
def set_post
@post = Post.find(params[:id].to_i)
end
或者,您也可以在find_by
上使用显式:id
方法 - 这应该完全跳过FriendlyId finder方法。