FriendlyID - 在admin命名空间中使用默认ID

时间:2017-04-04 08:08:56

标签: ruby-on-rails ruby friendly-id

我在我的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

1 个答案:

答案 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方法。