55

我应该如何将帖子标题转换为 Ruby 中的 slug?

标题可以有任何字符,但我只希望 slug 允许[a-z0-9-_](它应该允许任何其他字符吗?)。

所以基本上:

  • 小写所有字母
  • 将空格转换为连字符
  • 删除无关字符
4

5 回答 5

102

这是铁轨吗?(在辛纳特拉工作)

string.parameterize

就是这样。有关更复杂的 slugging,请参阅ActsAsUrl。它可以执行以下操作:

"rock & roll".to_url => "rock-and-roll"
"$12 worth of Ruby power".to_url => "12-dollars-worth-of-ruby-power"
"10% off if you act now".to_url => "10-percent-off-if-you-act-now"
"kick it en Français".to_url => "kick-it-en-francais"
"rock it Español style".to_url => "rock-it-espanol-style"
"tell your readers 你好".to_url => "tell-your-readers-ni-hao"
于 2010-11-29T23:47:35.780 回答
87
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')

downcase使其小写。strip确保没有前导或尾随空格。第一个gsub用连字符替换空格。第二个gsub删除所有非字母非破折号非下划线字符(请注意,这组非常接近\W但也包括破折号,这就是为什么在这里拼写出来)。

于 2010-11-29T21:44:08.490 回答
7

to_slug是一个很棒的 Rails 插件,可以处理几乎所有事情,包括时髦的字符,但它的实现非常简单。把它夹到字符串上,你就会被排序。这是浓缩的来源:

String.class_eval do
  def to_slug
    value = self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').to_s
    value.gsub!(/[']+/, '')
    value.gsub!(/\W+/, ' ')
    value.strip!
    value.downcase!
    value.gsub!(' ', '-')
    value
  end
end
于 2010-11-29T21:45:45.590 回答
3

我用过这个 gem。它很简单但很有帮助。

https://rubygems.org/gems/string_helpers

于 2012-10-19T00:49:20.813 回答
0

我喜欢FriendlyId,自称是制造蛞蝓的“瑞士陆军推土机”。https://github.com/norman/friendly_id

于 2010-11-29T23:17:24.033 回答