Friendly_id: slug_candidates неправильно называет слаг

У меня есть следующее в моей модели:

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-barker или же bob-barker-15 , но не оба.

https://github.com/norman/friendly_id

4 ответа

Решение

Функциональность вы описываете в версии 5

Смотрите: https://github.com/norman/friendly_id.

То, что вы написали, по сути, просто возвращает массив символов, который проходит через метод параметризации после преобразования в строку...

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

надеюсь, это поможет

FriendlyId автор здесь. Как упоминалось ранее, вам нужен FriendlyId 5 для этого, он не будет работать с 4.0.

Также обратите внимание, что вы не можете использовать поле id как часть слага, потому что слаг генерируется до создания записи.

Если вы хотите иметь поле идентификатора в слаге, то есть более простые решения, кроме FriendlyId, такие как переопределение to_param метод, как описано здесь.

[: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-запросов.

На конфликтах слизней, 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-doe, john-doe-2, john-doe-3, так далее.

Другие вопросы по тегам