friendly_id slug没有生成,但是调用了方法

时间:2016-06-25 20:54:02

标签: ruby-on-rails ruby postgresql spree friendly-id

我正在尝试将一个friendly_id slug添加到现有的Rails模型Spree :: Variant中。 Variant belongs_to Product,已经有自己的slug工作正常(Spree和这些模型来自第三方宝石)。

当我尝试保存Variant时,我希望生成一个slug并保存到数据库中的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被调用,并输出所需的信息。我的应用程序的示例返回值是“Titanium”。

为什么不创建我的slug?我在哪里可以进一步缩小问题?

1 个答案:

答案 0 :(得分:2)

我不能说我知道解决方案,但为了缩小问题范围,你需要检查{{}}将slug委托给product表。

在产品表上,slug是一个has_many关系,由use: :history知道。 (与问题无关)

问题在于Spree::Variant source code方法,如果表名存在,则提前返回,而不是相应地读取或更新记录。

解决这些问题的方法(因为我不知道Spree是否提供了更好的处理方法)是重新定义你的slug方法:

def slug
  read_attribute(:slug)
end

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

希望我能够提供帮助。