解析Rails模型中slug_candidates方法的作用及用法
理解Rails中FriendlyId的slug_candidates方法
咱们先把核心逻辑说透:slug_candidates就是FriendlyId这个gem的「候选slug生成规则列表」——它的作用是帮你生成不重复的友好URL标识(slug),而且会按你给的顺序挨个尝试,直到找到一个没人用过的。
先看第一个例子的逻辑
def slug_candidates [:title, [:title, :id] ] end
当你创建一条News记录时:
- 首先尝试直接用
title字段的值做slug,比如标题是「Rails 7新特性」,就生成rails-7-xin-te-xing(FriendlyId会自动转成小写、替换特殊字符) - 如果发现这个slug已经被别的News占用了(比如之前有一篇同名的),就自动切换到第二个候选规则:把
title和记录的id拼在一起,变成rails-7-xin-te-xing-123(123是这条记录的ID),这样就绝对不会重复了。
再看第二个例子的逻辑
def slug_candidates [ :name, [:name, 2], [:name, 3], [:name, 4], [:name, 5], [:name, 6], [:name, 7] ] end
这个是另一种重复处理思路:
- 先试纯
name,比如john-doe - 如果重复,就加个后缀2变成
john-doe-2 - 还重复就加3→
john-doe-3,一直到7 - 要是到7还重复(这种情况很少见),FriendlyId会自动 fallback 到用ID做后缀,不用担心冲突。
补充几个关键点
- 候选规则可以是单个模型属性(比如
:title),也可以是多个属性组成的数组(比如[:author, :title],会生成zhang-san-rails-7-xin-te-xing这样的slug) - 顺序很重要!FriendlyId严格按照数组从左到右的顺序尝试,所以把你最想要的slug格式放在最前面
- 只要数组里有候选能生成唯一slug,就会用那个,后面的候选不会再试
内容的提问来源于stack exchange,提问作者current_user
相关产品推荐
相关产品推荐

