Нужно обновить friendly_id вручную

У меня есть фото по URL:

www.mysite.com/here-is-my-url

Я создал замену для этой фотографии, но хочу, чтобы старый URL указывал на новый ресурс. Т.е. новый ресурс www.mysite.com/new-url, но я хочу, чтобы URL был www.mysite.com/here-is-my-url, а для старого ресурса я хочу изменить его на что-то совсем другое.

Я знаю, что лучше не возиться вручную со слагами friendly_id, НО это аварийная разовая вещь, и я пытаюсь найти самый безболезненный способ сделать это (желательно через консоль).

Какие-нибудь мысли? Мне в основном нужен доступ к таблице friendly_id_slugs через консоль, но я получаю неинициализированную постоянную ошибку, когда пытаюсь сделать FriendlyIdSlug.all .

3 ответа

Решение
def should_generate_new_friendly_id?
  slug.blank? || name_changed?
end

добавьте это к вашей модели. name_change? должно быть [whatever your column is that decides the slug]_changed?

Есть способ сделать это через консоль. У меня есть сайт, который мне нужен, чтобы обновить один дружественный идентификатор, потому что мы продвигали URL-адрес с напечатанными листовками. Архаичный, да, я знаю. Попробуй это:

Model.all (find to find the id of the slug you'd like to change)
u = Model.find(id) (integer of the id you'd like to change)
u.slug = nil
u.slug = 'slug-of-your-choice'
u.update_attribute(:slug, 'slug-of-your-choice')

Теперь, если вы проверите Model.all, вы увидите свой объект Model с обновленным вручную слагом. Также проверено на живом сайте. Использование u.save после обновления пули не работает для меня. Кроме того, стиль update_attribute, используемый здесь, является Rails 3, поэтому используйте Rails 4 синтаксис для Rails 4.

Обычно нет FriendlyIdSlug модель / таблица, поэтому получение неинициализированной постоянной ошибки на FriendlyIdSlug.all вроде нормально.

Когда вы добавляете friendly_id к ресурсу, он просто добавляет slug поле, которое восстанавливается на основе указанного поля (title в вашем случае) всякий раз, когда он пуст. Если стандартная процедура генерации пули дает вам пуля, который не является уникальным в соответствующей таблице, friendly_id изменяет это, добавляя --n (n целое число), пока оно не станет уникальным.

Тем не менее, чтобы решить вашу ситуацию, вы должны

  1. Измените название старого объекта, установите его слаг nil, спасти.
  2. Установите слаг нового объекта на nil, спасти.
  3. Измените название старого объекта обратно, если это необходимо.

Например, если ваша модель Photo, это будет что-то вроде этого в вашей консоли:

old = Photo.find('here-is-my-url')
new = Photo.find('here-is-my-url--2')
old.title = 'Here is my OLD URL'
old.slug = nil
old.save
new.slug = nil
new.save
Другие вопросы по тегам