Friendly_Id и зарезервированные слова — Как я могу заменить зарезервированное слово?

#ruby-on-rails #ruby #validation #friendly-id

#ruby-on-rails #ruby #проверка #friendly-id

Вопрос:

Вот пример того, что вызывает ошибку:

 ruby-1.9.2-p290 :004 > Post.new(title: "new").save!
   (0.3ms)  BEGIN
  post Load (0.3ms)  SELECT `posts`.* FROM `posts` WHERE (`slug` = 'new' OR `slug` LIKE 'new--%') ORDER BY LENGTH(`slug`) DESC, `slug` DESC LIMIT 1
   (0.3ms)  SELECT 1 FROM `posts` WHERE `posts`.`lsi_post_id` = BINARY '' LIMIT 1
   (0.1ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Friendly is reserved
  

Я хотел бы поместить что-то в модель Post, которая, возможно, заменяет новое слово на «-» или что-то в этом роде, но я не уверен, с чего начать.

Спасибо!

Комментарии:

1. Я хотел бы добавить, что причиной этого является использование слов, которые будут превращены в пули, таких как «Admin» в моем случае. Когда я заполнял свою базу данных, я сделал свое имя пользователя чем-то другим, кроме Admin, чтобы пуля не конфликтовала с зарезервированными словами. Я надеюсь, что это поможет!

Ответ №1:

Используя ответы daemonsy и SizzlePants, я придумал это, которое тихо переименовывает «new» в «new2» и «edit» в «edit2», а все остальное сохраняет как раньше:

 class Page < ActiveRecord::Base

  extend FriendlyId
  friendly_id :friendly_id_title, use: :slugged
  def friendly_id_title
    case title.parameterize
    when 'new' then 'new2'
    when 'edit' then 'edit2'
    else title
    end
  end

end
  

Ответ №2:

Я только что заметил, что это старый вопрос. Очень хотелось бы узнать, как вы тоже решили проблему.

7 ключевых слов RESTful заблокированы дружественными вариантами в виде пули. Нарушитель здесь new .

Из вашего кода кажется, что вы пытаетесь установить для slug значение «new», поскольку это заголовок вашего сообщения.

Чтобы предотвратить использование зарезервированных слов, вы можете заставить генератор слагов использовать метод вместо столбца.

 class Post < ActiveRecord::Base
  extend FriendlyId 

  friendly_id :name_and_id, :use=>:slugged # Used slugged mode, need a slug column in db.

  def name_and_id
    "#{id}-#{name}"
  end

end
  

Из этого примера кода, при создании записи с названием my post , переход к localhost:3000/posts/1-my-post работает. - Разделитель добавляется автоматически и может быть изменен.

Смотрите Friendly Id Guide.rdoc для получения более подробной информации.

Комментарии:

1. Я опубликовал свое решение… Ваше решение гораздо проще.

2. Они оба работают =). Но, возможно, если у вас есть reserved_words, вам нужно их поддерживать, каждая новая версия FriendlyId может добавлять / удалять слова. Добавление идентификатора к имени сделает слаг всегда уникальным (пальцы скрещены). Зарезервированные слова в friendly хороши для того, чтобы убедиться, что вы в конечном итоге не используете слова действия. Спасибо за сообщение!

3. это может потребовать немного больше размышлений, friendly_id использует before проверку, поэтому идентификатор недоступен во время создания slug. Если вы хотите сделать это, вы можете либо выполнить «двойное сохранение» через observer, чтобы обновить идентификатор, либо просто избежать использования идентификатора в пользовательском методе slug.

4. Когда я использовал дружественный идентификатор, добавление id-name сработало для новой записи. Надеюсь, FriendlyId не «угадывает», что это за новый идентификатор. Я снова проведу расследование. Спасибо!

Ответ №3:

Вот как я справлялся со всем этим.. Я действительно не уверен, правильно это или неправильно… но пока я им пользуюсь. Было бы очень приятно услышать другие предложения.

Мой помощник по приложению выглядит примерно так:

 module ApplicationHelper
  # Friendly_Id reserved words
  def niceify_slug(s)
    clean_slug = s
    reserved_words = ["new", "edit"]
    reserved_words.each { |word| clean_slug = clean_slug.gsub(/b#{word}b/i, "#{word}_") }

    return clean_slug
  end
end
  

Моя модель выглядит примерно так:

 class MyModel < ActiveRecord::Base
  include ApplicationHelper

  # Slugs via FriendlyId
  extend FriendlyId
  friendly_id :niceified_name, :use => :slugged

  def niceified_name
    niceify_slug(self.name)
  end
end