ruby-on-rails – Rails4 Friendly_id独特的Slug格式

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails4 Friendly_id独特的Slug格式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用friendly_id gem来阻止我的模型.因为当我输入相同的数据来检查时,slug必须是唯一的,我会在slug中附加一个长的哈希值.
Explore     explore 
Explore     explore-7a8411ac-5af5-41a3-ab08-d32387679f2b

有没有办法告诉friendly_id提供更好的格式化slug,如explore-1和explore-2

版本:friendly_id 5.0.4

解决方法

同意,这似乎是非常粗暴的行为.

如果你看一下friendly_id / slugged.rb的代码,有2个函数处理冲突解决逻辑:

def resolve_friendly_id_conflict(candidates)
  candidates.first + friendly_id_config.sequence_separator + SecureRandom.uuid
end

# Sets the slug.
def set_slug(normalized_slug = nil)
  if should_generate_new_friendly_id?
    candidates = FriendlyId::Candidates.new(self,normalized_slug || send(friendly_id_config.base))
    slug = slug_generator.generate(candidates) || resolve_friendly_id_conflict(candidates)
    send "#{friendly_id_config.slug_column}=",slug
  end
end

所以,这个想法只是为了修补它.我看到2个选项:

>只需修补resolve_friendly_id_conflict,添加随机后缀.
>改变两种方法的逻辑,试图尝试所有候选者,直到slug_generator.generate(候选者)返回非空的东西.如果所有候选人都给nil然后回退到resolve_friendly_id_conflict方法.
使用这种技术,你可以使用slug候选者在slug不唯一时附加模型的id.

理想情况下,如果gem的作者添加了一个配置选项来处理独特的slugs解析(方法符号或proc将生成器和候选者作为params)或者只是检查模型是否响应某种方法,那将是很好的.

此外,在一些使用案例中,根本不需要独特的段塞分辨率.例如,如果我们只想依靠validates_uniqueness_of:slug或候选者的唯一性验证.

猜你在找的Ruby相关文章