我正在构建一个使用globalize gem的应用程序。我正在尝试为永久链接添加Friendly ID gem。
我的Product
表实际上没有name
列。 name
列存储在Product::Translation
中,因此我无法使用他们在github页面中推荐的friendly_id :name, use: :slugged
设置。
我想将永久链接设置为英文翻译的name
属性。这就是我到目前为止所做的:
before_save :update_slug
def update_slug
english_translation = translations.find { |t| t.locale == :en }
self.slug = english_translation.name if english_translation
end
但是,这不会将english_translation.name变量转换为参数友好格式。如果我的名字为something sdfsdfs sdfsf
,则slug将是相同的并且会破坏事物,因为路径将是/products/something sdfsdfs sdfsf
所有空格。
我是否可以运行将字符串转换为slug格式的方法?类似的东西:
before_save :update_slug
def update_slug
english_translation = translations.find { |t| t.locale == :en }
self.slug = slugify(english_translation.name)
end
我需要一个方法,我可以使用参数手动运行以生成slug。
答案 0 :(得分:3)
我猜是为了后人:
class Product < ActiveRecord::Base
friendly_id :default_slug, use: :slugged
def default_slug
english_translation = translations.find { |t| t.locale == :en }
english_translation.try(:name)
end
end
答案 1 :(得分:3)
<强> Friendly_ID 强>
正如Greg Burgardt
所说,你的目标是将价值转化为friendly_id
,允许它构建你的slu ..
您的方法是尝试手动创建slug
属性 - 您可以更好地从translation
获取值并将其传递给friendly_id。要做到这一点,这就是我要做的事情:
#app/models/product.rb
class Product < ActiveRecord::Base
extend Friendly_ID
friendly_id :name, use: :slugged
def name
english_translation = translations.find { |t| t.locale == :en }
english_translation.name
end
end
Friendly_ID builds your slug,表示您不想自己创建slug
:
由于UUID很难看,FriendlyId提供了“slug候选者” 允许您指定在事件中使用的备用slugs的功能 你想要使用的那个已经被使用了。例如:
class Restaurant < ActiveRecord::Base extend FriendlyId friendly_id :slug_candidates, use: :slugged # Try building a slug based on the following fields in # increasing order of specificity. def slug_candidates [ :name, [:name, :city], [:name, :street, :city], [:name, :street_number, :street, :city] ] end end r1 = Restaurant.create! name: 'Plaza Diner', city: 'New Paltz' r2 = Restaurant.create! name: 'Plaza Diner', city: 'Kingston' r1.friendly_id #=> 'plaza-diner' r2.friendly_id #=> 'plaza-diner-kingston'
要使用候选项,请使您的FriendlyId基本方法返回一个数组。 该方法不需要命名为
slug_candidates
;它可以是你的任何东西 想。该数组可以包含符号,字符串,过程的任何组合 或lambdas将被懒惰地按顺序评估。如果你包括 如果符号,FriendlyId将使用。在模型类上调用方法 一样的名字。字符串将按字面解释。 Procs和lambdas 将被调用,并将其返回值用作基础 友好的身份。如果没有一个候选人可以产生一个独特的slug, 然后,FriendlyId会将UUID作为最后一个附加到第一个候选人 胜地。