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


person Abram    schedule 01.12.2013    source источник
comment
Не то, чтобы это было источником проблемы, но у вас не должно быть запятой после последнего элемента в вашем массиве slug_candidates [:full_name, :id], <<<   -  person Damien Roche    schedule 01.12.2013
comment
какую версию friendly_id вы используете? вы пытались использовать мастер github? Я думаю, что вы всегда должны использовать символы, иначе все поля будут оцениваться при вызове метода.   -  person phoet    schedule 01.12.2013
comment
Хорошо, фиксированные символы и запятая и использование friendly_id (4.0.10.1) ... все еще не слава   -  person Abram    schedule 01.12.2013
comment
похоже, что искомая функциональность доступна только в версии 5 github.com/norman/friendly_id#what-changed-in-version-50   -  person Matenia Rossides    schedule 03.12.2013


Ответы (4)


Функциональность, которую вы описываете, находится в версии 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"

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

person Matenia Rossides    schedule 03.12.2013

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

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

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

person Norman Clarke    schedule 10.12.2013

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

person Dima Melnik    schedule 27.10.2014

При конфликтах слагов 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 и т. д.

person tejasbubane    schedule 02.12.2015