我正在尝试将一个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?我在哪里可以进一步缩小问题?
答案 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
希望我能够提供帮助。