在Rails中生成slu((人类可读的ID)的最佳方法

你知道,就像myblog.com/posts/donald-e-knuth。

我应该使用内置的parameterize方法来做到这一点吗?

怎么样一个插件? 我可以想象一个插件是很好的处理重复slu,,等等。这里有一些stream行的Github插件 – 有没有人有任何经验与他们?

  1. http://github.com/rsl/stringex/tree/master
  2. 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应该是逻辑的,而不是数据。

我在这个推理之后写了一篇文章,希望有一些帮助。

http://blog.ereslibre.es/?p=343