在Rails中生成slu((人类可读的ID)的最佳方法
你知道,就像myblog.com/posts/donald-e-knuth。
我应该使用内置的parameterize
方法来做到这一点吗?
怎么样一个插件? 我可以想象一个插件是很好的处理重复slu,,等等。这里有一些stream行的Github插件 – 有没有人有任何经验与他们?
- http://github.com/rsl/stringex/tree/master
- http://github.com/norman/friendly_id/tree/master
基本上,slu seems似乎是一个彻底解决的问题,我不想重新发明轮子。
我使用以下,这将
- 翻译& – >“和”和@ – >“在”
- 不插入下划线来代替撇号,所以“foo's” – >“foos”
- 不包括双下划线
- 不会创build以下划线开头或结尾的slu </s>
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"
在Rails中,你可以使用#parameterize
例如:
> "Foo bar`s".parameterize => "foo-bar-s"
生成slu best的最好方法是使用Unidecode gem 。 它是迄今为止最大的音译数据库。 它甚至还有汉字的音译。 更不用说涵盖所有的欧洲语言(包括当地的方言)。 它保证了一个防弹slu creation创作。
例如,考虑那些:
"Iñtërnâtiônàlizætiøn".to_slug => "internationalizaetion" >> "中文測試".to_slug => "zhong-wen-ce-shi"
我在我的ruby_extensions插件的String.to_slug方法的版本中使用它。 请参阅to_slug方法的ruby_extensions.rb。
这是我使用的:
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
我修改了一下创build破折号而不是下划线,如果有人感兴趣:
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
我的应用程序的主要问题是撇号 – 很less你想要坐在那里自己的。
class String def to_slug self.gsub(/['`]/, "").parameterize end end
自2007年以来,Unidecoder的gem尚未更新。
我build议使用包括Unidecoder gemfunction在内的strictgex gem。
https://github.com/rsl/stringex
看看它的源代码,它似乎重新包装Unidecoder源代码并添加新的function。
我们使用to_slug http://github.com/ludo/to_slug/tree/master
。 做我们需要做的一切(逃避'时髦人物')。 希望这可以帮助。
编辑:似乎打破了我的链接,对此感到遗憾。
最近我有同样的困境。
因为像你一样,我不想重新发明轮子,所以我select了“Ruby工具箱:Rails Permalinks&Slugs”的比较之后的friendly_id 。
我根据我的决定:
- github监视器的数量
- 没有。 github叉子
- 什么时候是最后一次提交
- 没有。 的下载
希望这有助于做出决定。
我发现Unidecode gem太重了,为我所需要的加载了近200个YAML文件。 我知道iconv
对基础翻译有一定的支持,尽pipe它不完美,但内置并且相当轻巧。 这就是我想到的:
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
显然你应该把它作为一个实例方法添加到你将要运行的任何对象上,但是为了清楚起见,我没有。
使用Rails 3,我创build了一个初始化器slug.rb,我在其中放置了以下代码:
class String def to_slug ActiveSupport::Inflector.transliterate(self.downcase).gsub(/[^a-zA-Z0-9]+/, '-').gsub(/-{2,}/, '-').gsub(/^-|-$/, '') end end
然后我在代码中的任何地方使用它,它是为任何string定义的。
音译将诸如é,á,ô之类的东西变成e,a,o。 因为我正在用葡萄牙语开发一个网站,这很重要。
我知道这个问题现在有一段时间了。 不过,我看到一些相对较新的答案。
在数据库上保存slug是有问题的,并保存已经存在的冗余信息。 如果你仔细想想,没有理由挽救slu </s>。 slu should应该是逻辑的,而不是数据。
我在这个推理之后写了一篇文章,希望有一些帮助。