Ruby on rails FriendlyID-在管理命名空间中使用默认ID

Ruby on rails FriendlyID-在管理命名空间中使用默认ID,ruby-on-rails,ruby,friendly-id,Ruby On Rails,Ruby,Friendly Id,我已经在我的rails应用程序上安装了。我已经按照关于这个问题的说明,并根据第一个选项更改了我的链接 # before: admin_post_path(@post) link_to admin_post_path(@post.id) 到目前为止还不错,但是当我试图提交_表单时,我得到了以下错误 找不到id=hello world的帖子 经过一些调试后,我发现发生了这种情况,因为我还从Post.find中删除了.friendly方法,因此: def set_post # before:

我已经在我的rails应用程序上安装了。我已经按照关于这个问题的说明,并根据第一个选项更改了我的链接

# before: admin_post_path(@post)
link_to admin_post_path(@post.id)
到目前为止还不错,但是当我试图提交_表单时,我得到了以下错误

找不到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
上并删除这个额外的查询?请记住,我希望这只应用于管理名称空间,因此在前端,链接应该使用友好id和slug工作,因为友好id的
查找
方法就是这样设计的。对于数字字符串,它将首先进行友好查找,然后返回到常规查找

看看(以及这些优秀的评论),你会发现有一种方法可以解决这个问题——我们可以让
id
变得“不友好”

这被认为是“不友好的”。在这种情况下,您可以通过自己将
params[:id]
转换为整数值来删除额外的查询:

def set_post
  @post = Post.find(params[:id].to_i)
end

或者,您也可以在
:id
上使用显式的
find_by
方法,该方法应完全跳过FriendlyId查找方法。

您将看到两个查询,因为FriendlyId的
find
方法就是这样设计的。对于数字字符串,它将首先进行友好查找,然后返回到常规查找

看看(以及这些优秀的评论),你会发现有一种方法可以解决这个问题——我们可以让
id
变得“不友好”

这被认为是“不友好的”。在这种情况下,您可以通过自己将
params[:id]
转换为整数值来删除额外的查询:

def set_post
  @post = Post.find(params[:id].to_i)
end

或者,您也可以在
:id
上使用显式的
find_by
方法,该方法应完全跳过FriendlyId finder方法。

生成的链接不是问题,而是查找本身的问题吗?我的意思是,在链接中使用slug而不是实际的id?op得到的错误是,
找不到id=hello world的帖子
@Iceman:hmm,据我所知不是这样。否则,您将不会在日志中看到
slug='1'
,而是slug值……不,您是对的,这似乎只是一个想法。不久前,我在friendly_id上遇到了类似的问题。链接似乎工作正常,问题发生在尝试提交表单时。不是生成的链接有问题,不是查找本身有问题吗?我的意思是,在链接中使用slug而不是实际的id?op得到的错误是,
找不到id=hello world的帖子
@Iceman:hmm,据我所知不是这样。否则,您将不会在日志中看到
slug='1'
,而是slug值……不,您是对的,这似乎只是一个想法。不久前,我在friendly_id上遇到了类似的问题。链接似乎工作正常,问题发生在尝试提交表单时