Friendly_id:slug_candidates没有正确命名slug

时间:2013-12-01 08:55:21

标签: ruby-on-rails friendly-id

我的模型中有以下内容:

class Dispenser < ActiveRecord::Base

  extend FriendlyId

  friendly_id :slug_candidates, use: :slugged

  def slug_candidates
    [
      :full_name,
      [:full_name, :id]
    ]
  end

end

这会产生像:

这样的slu ..
=> 'bob-barker-bob-barker-15'

确实应该是bob-barkerbob-barker-15,而不是两者。

https://github.com/norman/friendly_id

4 个答案:

答案 0 :(得分:7)

FriendlyId作者在这里。如前所述,您需要FriendlyId 5,它不适用于4.0。

另请注意,您不能将id字段用作slug的一部分,因为slug是在创建记录之前生成的。

如果您愿意在slug中使用id字段,那么除了FriendlyId之外,还有更简单的解决方案,例如覆盖here所述的to_param方法。

答案 1 :(得分:2)

您要描述的功能是版本5

请参阅:https://github.com/norman/friendly_id#what-changed-in-version-50

你所写的内容实际上只是返回一个符号数组,这些符号在被转换为字符串后通过参数化方法运行...

2.0.0p247 :002 > ['name',['name',15]].to_s.parameterize # this is what friendly_id does in the background
 => "name-name-15"

希望有所帮助

答案 2 :(得分:2)

[:full_name,:id] - 你只能在onUpdate上执行此操作(当:id已设置) 当您在数据库表中创建新记录时,这将无效!

为了你的目的,你应该使用像这样的

def slug_candidates
[
  :name,
  [:name, 2],
  [:name, 3],
  [:name, 4],
  [:name, 5],
  [:name, 6],
  [:name, 7],
]

或者很快

def slug_candidates
  [:name] + Array.new(6) {|index| [:name, index+2]}
end

在没有额外SQL查询的情况下解决此问题的简单方法

答案 3 :(得分:1)

在slug冲突中,FriendlyID默认使用UUID(例如2bc08962-b3dd-4f29-b2e6-244710c86106之类的内容)并且不接受id。所以这样的事情不会起作用:

def slug_candidates
  [
    :full_name,
    [:full_name, :id]
  ]
end

但您可以在:full_name之后提供自定义号码,而不是:id

我做了类似的事情:

def slug_candidates
  [
    :full_name,
    [:full_name, "#{User.where(
        first_name: first_name, last_name: last_name
      ).count + 1}"]
  ]
end

所以我会得到像john-doejohn-doe-2john-doe-3等等。