gpt4 book ai didi

ruby-on-rails - Friendly_id为Rails中的多个对象创建重复的slugs

转载 作者:行者123 更新时间:2023-12-02 04:19:00 24 4
gpt4 key购买 nike

我的 Rails 版本不包含路径名。该应用程序由两个主要对象组成:collectionsitems。所以如果我有一个链接:https://foo.com/foo ,这可能会识别一个集合或一个项目。整个应用程序的上下文和 UI 流程中的差异非常明显。

我的问题:有没有办法让Friendly ID gem通过查看一个slug是否已经被另一个对象获取来生成唯一的slugs?我知道您可以生成候选者,以便友好 ID 不会重复给定对象的 slug,但我需要友好 ID 在生成新的 slug 之前检查现有的集合 slug 和项目 slug。

我希望这听起来不会太令人困惑。更简洁地说:是否有一种方法可用于友好 ID 在生成新的 slug 之前检查多个对象中的 slugs?

最佳答案

注意这一切都未经测试,只是根据文档工作并阅读源代码。

您可以继承 FriendlyId::SlugGenerator 类,并重写 available? 方法来检查相反模型中的现有记录:

class CrossModelSlugGenerator << FriendlyId::SlugGenerator

def available?(slug)
if (@scope.class == "Item::ActiveRecord_Relation")
# Search for collections with this slug and return false if they exist.
elsif (@scope.class == "Collection::ActiveRecord_Relation")
# Search for items with the this slug and return false if they exist.
end

# Otherwise do a normal slug check
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a382e3d0c0ccd3c68dc6dbcad0d7d0" rel="noreferrer noopener nofollow">[email protected]</a>_by_friendly_id?(slug)
end

end

您可以在此处查看 SlugGenerator 类的完整代码:

https://github.com/norman/friendly_id/blob/master/lib/friendly_id/slug_generator.rb

然后您必须告诉友好 ID 配置使用该类。在 config/initializers/friend_id.rb 中创建初始化程序:

FriendlyId.defaults do |config|
config.slug_generator_class = "CrossModelSlugGenerator"
end

尝试一下,看看它是否适合您。再说一次,我还没有测试过任何一个,但看起来应该可行。

编辑 - 您可能需要将类包装在FriendlyId模块中,如下所示:

您可能需要在某个地方进行包含,可能在您的类定义中。另外,尝试将类包装到FriendlyId模块中,所以可能是这样的:

include "friendly_id"

module FriendlyId
class CrossModelSlugGenerator << SlugGenerator
...
end
end

通过此更改,您可能还需要在配置类名称中显式指定模块:

FriendlyId.defaults do |config|
config.slug_generator_class = "FriendlyId::CrossModelSlugGenerator"
end

关于ruby-on-rails - Friendly_id为Rails中的多个对象创建重复的slugs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31800547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com