【问题标题】:Friendly_id: slug_candidates not naming slug properlyFriendly_id:slug_candidates 没有正确命名 slug
【发布时间】:2013-12-17 02:35:44
【问题描述】:

我的模型中有以下内容:

class Dispenser < ActiveRecord::Base

  extend FriendlyId

  friendly_id :slug_candidates, use: :slugged

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

end

这会产生像这样的蛞蝓:

=> 'bob-barker-bob-barker-15'

确实应该是bob-barkerbob-barker-15,但不能同时使用。

https://github.com/norman/friendly_id

【问题讨论】:

  • 不是问题的根源,但您的 slug_candidates 数组中的最后一个元素后不应有逗号 [:full_name, :id], &lt;&lt;&lt;
  • 您使用的是什么版本的friendly_id?您是否尝试使用 github master?我认为您应该始终使用符号,否则在调用方法时将评估所有字段。
  • 好的,固定符号和逗号并使用friendly_id (4.0.10.1) ...仍然没有荣耀
  • 所以看起来您正在寻找的功能仅在版本 5 中可用github.com/norman/friendly_id#what-changed-in-version-50

标签: ruby-on-rails friendly-id


【解决方案1】:

您描述的功能在版本 5 中

见:https://github.com/norman/friendly_id#what-changed-in-version-50

你所写的基本上只是返回一个符号数组,它在转换为字符串后通过 parameterize 方法运行......

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

希望有帮助

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      [:full_name, :id] - 您只能在更新时执行此操作(当 :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 查询

      【讨论】:

        【解决方案4】:

        在 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 等这样的蛞蝓。

        【讨论】:

          猜你喜欢
          • 2020-12-15
          • 1970-01-01
          • 2022-01-24
          • 2021-04-05
          • 2015-09-08
          • 1970-01-01
          • 2012-04-06
          • 2020-05-27
          • 1970-01-01
          相关资源
          最近更新 更多