Rails 4 + Friendly_id gem:如何使用特定字符串生成slug?

时间:2014-08-28 16:47:41

标签: ruby-on-rails

我正在构建一个使用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。

2 个答案:

答案 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作为最后一个附加到第一个候选人   胜地。