FriendlyId не обновляет заголовок при изменении названия

Я создаю приложение Rails, используя ActiveAdmin, Globalize и FriendlyId.

В своей модели я настроил параметры Globalize и FriendlyId (выдержка):

class Post < ActiveRecord::Base
  translates :title, :slug, :content
  active_admin_translates :title, :slug, :content do
    validates :title, presence: true
  end

  extend FriendlyId
  friendly_id :slug_candidates,
              use: [:slugged, :history,  :globalize,  :finders]

  private

  def slug_candidates
    [[:title, :deduced_id]]
  end

  # Used to add prefix number if slug already exists
  def deduced_id
    count = Post.where(title: title).count
    return count + 1 unless count == 0
  end
end

Однако, когда я обновляю заголовок статьи в ActiveAdmin, ярлык никогда не обновляется с помощью friendly_id, поэтому я добавил этот метод:

def should_generate_new_friendly_id?
   title_changed? || super
end

Когда я это сделаю, title_changed? всегда ложно, так как новый заголовок не отправляется в модель по неизвестной мне причине, но для других непереведенных параметров они получаются правильно.

Ex:

logger.debug(title) # => Give me new updated title value BUT
title_changed? # => Always nil
online_changed? # => Works

Как это возможно, что модель не знает об обновлении переведенных атрибутов?
Что я пропустил?

Спасибо за вашу помощь !

Мой проект:

  • Rails 4.2.7.1 / Ruby 2.3.0
  • ActiveAdmin 1.0.0pre4
  • Глобализация 5.0.1
  • FriendlyId 5.1.0
  • FriendlyId Globalize 1.0.0.alpha2

Изменить: (выдержка из моей формы)

f.translated_inputs 'Translated fields', switch_locale: true do |t|
    t.input :title
    t.input :content
end

person anthony    schedule 18.10.2016    source источник


Ответы (1)


Но когда вы сохраняете модель в ActiveAdmin, если у вас есть поле слага в форме и вы его не чувствуете, то, что будет содержать пустую строку, не будет сгенерировано. Как это исправить? Переопределите метод установки ярлыка в модели следующим образом:

 def should_generate_new_friendly_id?
    slug.blank? || title_changed?
 end



   def slug=(value)
    if value.present?
      write_attribute(:slug, value)
    end
  end

попробуй это

person Serhii Danovskyi    schedule 18.10.2016
comment
Спасибо, но у меня в форме нет поля ввода слага (я отредактировал свой вопрос, добавив отрывок из формы). И когда я создаю новый пост, slug правильно устанавливается для всех языков. - person anthony; 18.10.2016