Rails gem "friendly_id": Как получить предварительный просмотр слага, прежде чем его объект будет создан

Используя гем Rails "friendly_id", возможно ли получить "предварительный просмотр" слагаемого, который будет создан? То есть до того, как объект будет сохранен (и будет возвращен при вводе с использованием ajax-запроса)?

Если так, то как?

2 ответа

Решение

FriendyId автор здесь.

FriendlyId внутренне использует частные set_slug сделать это. Этот метод вызывается через before_validation Перезвоните. Если по какой-то причине вы не хотите звонить valid?Вы можете вызвать set_slug метод через sendили определите метод в вашей модели, который вызывает его:

instance = ModelClass.new
instance.send(:set_slug)

# or
class ModelClass < ActiveRecord::Base
  friendly_id :name, use: :slugged

  def generate_slug_preview
    set_slug
  end
end 

Тем не менее, обратите внимание, что обход или игнорирование проверок часто является плохой идеей. Например, если ваша модель включила проверку на name поле, а затем вы использовали это поле в качестве основы для слаг, а затем вы просматриваете слаг, который фактически никогда не будет сгенерирован.

За https://github.com/norman/friendly_id/blob/master/test/slugged_test.rb...

  m1 = model_class.new :name => "a b c d"
  m1.valid?
  assert_equal "a-b-c-d", m1.slug

Похоже, это просто .slug, По другим тестам вам не нужно create - а new Сделаю. Итак, ваша стратегия такова:

  • добавить onchange обработчик текстового поля
  • каждый раз, когда пользователь изменяет его, используйте Ajax для отправки текущего значения на сервер
  • new экземпляр вашей модели с именем или другим значением, установленным в значение Ajax, отправленное
  • вызов slugи отправьте результат обратно на веб-страницу
  • показать его на веб-странице

Все это стандартные вещи Ajax, не имеющие ничего общего с friendly_id, Но все это заставляет меня задуматься, если - потому что вы показываете слизняк пользователю - friendly_id позволит вам отредактировать слаг, как это делают высококлассные блоги.

И вы, вероятно, должны позвонить valid? первый.

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