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
, но не оба.
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
, так далее.