你知道,比如myblog.com/posts/donald-e-knuth。
我应该do this with the built in parameterize
method吗?
插件怎么样?我可以想象一个插件很适合处理重复的slug等。这里有一些流行的Github插件 - 有没有人对它们有任何经验?
基本上看起来slu is是一个完全解决的问题,我不会重新发明轮子。
答案 0 :(得分:212)
答案 1 :(得分:51)
生成slug的最佳方法是使用Unidecode gem。它是迄今为止最大的音译数据库。它甚至包含汉字的音译。更不用说涵盖所有欧洲语言(包括当地方言)。它保证了防弹塞的创造。
例如,考虑那些:
"Iñtërnâtiônàlizætiøn".to_slug
=> "internationalizaetion"
>> "中文測試".to_slug
=> "zhong-wen-ce-shi"
我在ruby_extensions plugin的我的String.to_slug方法版本中使用它。有关to_slug方法,请参阅ruby_extensions.rb。
答案 2 :(得分:36)
我使用以下内容,
def to_slug
#strip the string
ret = self.strip
#blow away apostrophes
ret.gsub! /['`]/,""
# @ --> at, and & --> and
ret.gsub! /\s*@\s*/, " at "
ret.gsub! /\s*&\s*/, " and "
#replace all non alphanumeric, underscore or periods with underscore
ret.gsub! /\s*[^A-Za-z0-9\.\-]\s*/, '_'
#convert double underscores to single
ret.gsub! /_+/,"_"
#strip off leading/trailing underscore
ret.gsub! /\A[_\.]+|[_\.]+\z/,""
ret
end
所以,例如:
>> s = "mom & dad @home!"
=> "mom & dad @home!"
>> s.to_slug
> "mom_and_dad_at_home"
答案 3 :(得分:9)
以下是我使用的内容:
class User < ActiveRecord::Base
before_create :make_slug
private
def make_slug
self.slug = self.name.downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
end
end
非常自我解释,虽然唯一的问题是如果已经有相同的问题,那就不会是名字01或类似的东西。
示例:
".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
输出:-downcase-gsub-a-z1-9-chomp
答案 4 :(得分:6)
我修改了一下来创建短划线而不是下划线,如果有人感兴趣的话:
def to_slug(param=self.slug)
# strip the string
ret = param.strip
#blow away apostrophes
ret.gsub! /['`]/, ""
# @ --> at, and & --> and
ret.gsub! /\s*@\s*/, " at "
ret.gsub! /\s*&\s*/, " and "
# replace all non alphanumeric, periods with dash
ret.gsub! /\s*[^A-Za-z0-9\.]\s*/, '-'
# replace underscore with dash
ret.gsub! /[-_]{2,}/, '-'
# convert double dashes to single
ret.gsub! /-+/, "-"
# strip off leading/trailing dash
ret.gsub! /\A[-\.]+|[-\.]+\z/, ""
ret
end
答案 5 :(得分:6)
我的应用程序的主要问题是撇号 - 很少你想让它自己坐在那里。
class String
def to_slug
self.gsub(/['`]/, "").parameterize
end
end
答案 6 :(得分:4)
Unidecoder gem自2007年以来一直没有更新。
我推荐使用stringex gem,其中包含Unidecoder gem的功能。
https://github.com/rsl/stringex
查看它的源代码,似乎重新打包Unidecoder源代码并添加新功能。
答案 7 :(得分:3)
我们使用to_slug http://github.com/ludo/to_slug/tree/master
。我们需要它做的一切(逃避'时髦的角色')。希望这会有所帮助。
答案 8 :(得分:3)
最近我遇到了同样的困境。
因为和你一样,我不想重新发明轮子,所以我在friendly_id进行比较后选择了 The Ruby Toolbox: Rails Permalinks & Slugs 。
我的决定是基于:
希望这有助于做出决定。
答案 9 :(得分:2)
我发现Unidecode gem太重了,加载了近200个YAML文件,满足我的需要。我知道iconv
对基本翻译有一些支持,虽然它并不完美,但它内置且相当轻巧。这就是我想出的:
require 'iconv' # unless you're in Rails or already have it loaded
def slugify(text)
text.downcase!
text = Iconv.conv('ASCII//TRANSLIT//IGNORE', 'UTF8', text)
# Replace whitespace characters with hyphens, avoiding duplication
text.gsub! /\s+/, '-'
# Remove anything that isn't alphanumeric or a hyphen
text.gsub! /[^a-z0-9-]+/, ''
# Chomp trailing hyphens
text.chomp '-'
end
显然你应该把它作为一个实例方法添加到你要运行它的任何对象上,但为了清楚起见,我没有。
答案 10 :(得分:0)
使用Rails 3,我创建了一个初始化程序slug.rb,我在其中输入了以下代码:
class String
def to_slug
ActiveSupport::Inflector.transliterate(self.downcase).gsub(/[^a-zA-Z0-9]+/, '-').gsub(/-{2,}/, '-').gsub(/^-|-$/, '')
end
end
然后我在代码中的任何地方使用它,它被定义为任何字符串。
音译将é,á,ô等内容转换为e,a,o。当我用葡萄牙语开发一个网站时,这很重要。
答案 11 :(得分:-2)
我知道这个问题现在有一段时间了。但是我看到了一些相对较新的答案。
将slug保存在数据库上是有问题的,您可以保存已存在的冗余信息。如果你考虑一下,没有理由保存slu .. slug应该是逻辑,而不是数据。
我按照这个推理写了一篇文章,希望有所帮助。