Слаг friendly_id не генерируется, но вызываются методы

Я пытаюсь добавить слаг friendly_id в существующую модель Rails, Spree::Variant. Вариант принадлежит продукту, у которого уже есть собственные слаги, которые отлично работают (Spree и эти модели взяты из стороннего гема).

Когда я пытаюсь сохранить вариант, я ожидаю, что слаг будет сгенерирован и сохранен в поле slug в базе данных, но поле остается NULL.

Вот код моей модели:

Spree::Variant.class_eval do
  extend FriendlyId
  friendly_id :slug_candidates, :use => :slugged
  validates :slug, length: { minimum: 3 }, allow_blank: true, uniqueness: true

  self.whitelisted_ransackable_attributes = %w[weight sku slug]

  def parent_slug
    self.product.slug
  end

  def option_value_list
    if !self.option_values.nil? && self.option_values.length > 0
      opts = self.option_values.collect{ |v| 
      v.presentation }.join('-')
      return opts
    else
      return ''
    end
  end

  def slug_candidates
    [
      [:parent_slug, :option_value_list],
      [:parent_slug, :option_value_list, :sku]
    ]
  end

  def should_generate_new_friendly_id?
    puts "Is new #{new_record?}, is blank #{slug.blank?}" #Is new false, is blank true when updating test record
    new_record? || slug.blank?
  end

end

На подобные вопросы отвечают, чтобы убедиться, что should_generate_new_friendly_id? определено правильно, как здесь. Я проверил, что он вызывается и возвращает True, когда я обновляю запись, но запись все еще не заканчивается слагом.

Я также проверил, что option_value_list вызывается и выводит нужную информацию. Пример возвращаемого значения из моего приложения: «Титан».

Почему мой слаг не создается? Куда я могу обратиться, чтобы еще больше сузить проблему?


person Jessa    schedule 25.06.2016    source источник


Ответы (1)


Я не могу сказать, что знаю решение, но чтобы сузить проблему, вам нужно проверить Spree::Variant исходный код, который делегирует слаг таблице product.

В таблице продуктов slug представляет собой отношение has_many, известное как use: :history. (не относится к проблеме)

Проблема связана с Spree::Core::DelegateBelongsTo#(delegator_for_setter|| delegator_for) методы, которые возвращаются раньше, если имя столбца существует в таблице, а не считывают или обновляют записи соответствующим образом.

Способ обойти это (поскольку я не знаю, обеспечивает ли Spree лучший подход для их обработки) состоит в том, чтобы переопределить ваши методы slug как таковые:

def slug
  read_attribute(:slug)
end

def slug=(new_slug)
  write_attribute(:slug, new_slug)
end

Надеюсь, я смог помочь.

person oreoluwa    schedule 26.06.2016