使用friendly_id缩放问题

时间:2014-07-19 10:05:18

标签: ruby-on-rails friendly-id

好的,我正在努力制作一个允许我有效扩展它的friendly_id。这是我到目前为止所得到的。如果您有一个匹配的名称,它的作用基本上是在计数上加+1。因此,如果您是第二个注册为John doe的人,您的网址将是/ john-doe-1。

extend FriendlyId
friendly_id :name_and_maybe_count, use: [:slugged, :history] 


def name_and_maybe_count
 number = User.where(name: name).count
 return name if number  == 0
 return  "#{name}-#{number}"
end

然而,这段代码仍然给我带来了一些问题。

  • 如果我创建了一个名为John Doe的用户。然后注册另一个名为John Doe的用户slug将是/ john-doe-UUID。如果我注册第三个用户,那么它将收到slu jo john-doe-1。
  • 如果我有两个用户。首先注册名称的人。说胡安巴勃罗。然后他将自己的名字改为“罗德里戈”,然后将其改回“胡安·巴勃罗”。他原来名字的新slu will将是'juan-pablo-1-UUID'。

我知道这对你们大多数人来说都是次要的挑剔,但这是我需要解决的问题!

1 个答案:

答案 0 :(得分:0)

您想要覆盖to_param,将id包含为友好ID的第一位

我在我的一个应用程序中扩展了这样的活动记录,

module ActiveRecord
  class Base
    def self.uses_slug(attrib = :name)
      define_method(:to_param) do
        "#{self.id}-#{self.send(attrib).parameterize}"
      end
    end
end

所以我可以做到

uses_slug :name

在任何模型中 但是在任何模型中都应该有效:

def to_param
  "#{self.id}-#{self.my_attrib.parameterize}"
end

这样做的好处在于你在控制器中执行

Model.find(params[:id]) 

你不必改变任何东西,因为当rails试图转换像" 11-my-cool-friendly-id" 这样的字符串时,它只会采取第一个数字位并保留其余部分。