Gol*_*ets 1 ruby-on-rails friendly-id ruby-on-rails-4
我的 Rails 构建不包含路径名。该应用程序由两个主要对象组成:collections和items. 因此,如果我有一个链接:https://foo.com/foo,这可能会标识一个集合或一个项目。在整个应用程序的上下文和 UI 流中,差异很明显。
我的问题:有没有办法让友好 ID gem 通过查看一个 slug 是否已经被另一个对象占用来生成唯一的 slugs?我知道您可以生成候选对象,以便友好 ID 不会复制给定对象的 slug,但我需要友好 ID 在生成新的 slug 之前检查现有的集合 slug 和项目 slug。
我希望这听起来不会太令人困惑。更简洁地说:是否有一种方法可用于友好 ID 在生成新的 slug 之前检查多个对象中的 slug?
注意这都是未经测试的,只是从文档中工作并阅读源代码。
您可以继承FriendlyId::SlugGenerator类,并覆盖可用的?检查对立模型中现有记录的方法:
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
!@scope.exists_by_friendly_id?(slug)
end
end
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看 SlugGenerator 类的完整代码:
https://github.com/norman/friendly_id/blob/master/lib/friendly_id/slug_generator.rb
然后,您必须告诉友好 ID 配置使用该类。在config/intitializers/friendly_id.rb 中创建一个初始化器:
FriendlyId.defaults do |config|
config.slug_generator_class = "CrossModelSlugGenerator"
end
Run Code Online (Sandbox Code Playgroud)
试试看,看看它是否适合你。同样,我还没有测试过任何一个,但似乎应该可以解决。
编辑- 您可能需要将类包装在 FriendlyId 模块中,如下所示:
您可能需要在某处包含一个包含,可能在您的类定义中。另外,尝试将类包装到 FriendlyId 模块中,所以可能是这样的:
include "friendly_id"
module FriendlyId
class CrossModelSlugGenerator << SlugGenerator
...
end
end
Run Code Online (Sandbox Code Playgroud)
通过此更改,您可能还需要在配置类名称中显式指定模块:
FriendlyId.defaults do |config|
config.slug_generator_class = "FriendlyId::CrossModelSlugGenerator"
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1136 次 |
| 最近记录: |