friendly_id 未生成 slug,但正在调用方法
friendly_id slug not generating, but methods being called
我正在尝试向现有的 Rails 模型 Spree::Variant 添加一个 friendly_id slug。变体 belongs_to 产品,它已经有自己的 slug 并且工作正常(Spree 和这些模型来自第 3 方 gem)。
当我尝试保存 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?
来回答类似的问题,它似乎在这里。当我更新记录时,我已经验证它被调用并且 return True,但记录仍然没有结束。
我还验证了 option_value_list
被调用,并输出了所需的信息。我的应用中的示例 return 值是 "Titanium".
为什么我的 slug 没有创建?我在哪里可以进一步缩小问题的范围?
我真的不能说我知道解决方案,但要缩小问题范围,您需要检查 Spree::Variant
source code 将 slug 委托给 product
table。
在产品 table 上,slug
是一个 has_many 关系,由 use: :history
知道。 (与问题无关)
问题出在 Spree::Core::DelegateBelongsTo#(delegator_for_setter|| delegator_for)
方法上,如果 table 上存在列名,这些方法会提前返回,而不是相应地读取或更新记录。
解决这些问题的一种方法(因为我不知道 Spree 是否提供了更好的方法来处理这些问题)是重新定义你的 slug 方法:
def slug
read_attribute(:slug)
end
def slug=(new_slug)
write_attribute(:slug, new_slug)
end
希望我能帮上忙。
我正在尝试向现有的 Rails 模型 Spree::Variant 添加一个 friendly_id slug。变体 belongs_to 产品,它已经有自己的 slug 并且工作正常(Spree 和这些模型来自第 3 方 gem)。
当我尝试保存 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?
来回答类似的问题,它似乎在这里。当我更新记录时,我已经验证它被调用并且 return True,但记录仍然没有结束。
我还验证了 option_value_list
被调用,并输出了所需的信息。我的应用中的示例 return 值是 "Titanium".
为什么我的 slug 没有创建?我在哪里可以进一步缩小问题的范围?
我真的不能说我知道解决方案,但要缩小问题范围,您需要检查 Spree::Variant
source code 将 slug 委托给 product
table。
在产品 table 上,slug
是一个 has_many 关系,由 use: :history
知道。 (与问题无关)
问题出在 Spree::Core::DelegateBelongsTo#(delegator_for_setter|| delegator_for)
方法上,如果 table 上存在列名,这些方法会提前返回,而不是相应地读取或更新记录。
解决这些问题的一种方法(因为我不知道 Spree 是否提供了更好的方法来处理这些问题)是重新定义你的 slug 方法:
def slug
read_attribute(:slug)
end
def slug=(new_slug)
write_attribute(:slug, new_slug)
end
希望我能帮上忙。