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

Tom*_*man 61 ruby-on-rails slug

你知道,比如myblog.com/posts/donald-e-knuth.

我应该使用内置parameterize方法吗?

插件怎么样?我可以想象一个插件很适合处理重复的slug等.这里有一些流行的Github插件 - 有没有人对它们有任何经验?

  1. http://github.com/rsl/stringex/tree/master
  2. http://github.com/norman/friendly_id/tree/master

基本上看起来slu is是一个完全解决的问题,我不会重新发明轮子.

gro*_*ser 214

在Rails中,您可以使用#parameterize

例如:

> "Foo bar`s".parameterize 
=> "foo-bar-s"
Run Code Online (Sandbox Code Playgroud)

  • 问题说"在Rails中"应该提升 (4认同)
  • 我可以为 Rails 方法中的构建感到高兴吗?可能不是因为我们都是开发人员;而是因为我们都是开发人员。但是,值得一试。 (2认同)
  • 有一个参数化的陷阱。下划线不会变为短划线。 (2认同)
  • `.gsub(/_/, '-').parameterize` 将是解决 @emptywalls 带来的问题的解决方案。 (2认同)

Paw*_*cki 51

生成slug的最佳方法是使用Unidecode gem.它是迄今为止最大的音译数据库.它甚至包含汉字的音译.更不用说涵盖所有欧洲语言(包括当地方言).它保证了防弹塞的创建.

例如,考虑那些:

"Iñtërnâtiônàlizætiøn".to_slug
=> "internationalizaetion"

>> "????".to_slug
=> "zhong-wen-ce-shi"
Run Code Online (Sandbox Code Playgroud)

我在我的ruby_extensions插件中的String.to_slug方法版本中使用它.有关to_slug方法,请参阅ruby_extensions.rb.

  • 我认为更好的是stringex gem http://github.com/rsl/stringex/tree/master,因为它在其中使用了它并且还添加了其他有用的东西. (4认同)
  • 你真的想把所有东西都转换成ascii吗?对于SEO来说,unicode网址不是更好吗? (3认同)

klo*_*ner 36

我会使用以下内容

  • 翻译& - >"和"和@ - >"at"
  • 没有插入下划线代替撇号,所以"foo's" - >"foos"
  • 不包括双下划线
  • 不会创建以下划线开头或结尾的slug

  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
Run Code Online (Sandbox Code Playgroud)

所以,例如:


>> s = "mom & dad @home!"
=> "mom & dad @home!"
>> s.to_slug
> "mom_and_dad_at_home"
Run Code Online (Sandbox Code Playgroud)

  • 根据谷歌的说法,破折号优于下划线:http://www.google.com/support/webmasters/bin/answer.py?answer = 76329`考虑在您的网址中使用标点符号.网址http://www.example.com/green-dress.html对我们来说比http://www.example.com/greendress.html更有用.我们建议您在URL中使用连字符( - )而不是下划线(_) (20认同)
  • 超链接经常加下划线.如果使用下划线,通常很难区分"链接"和"a_link".连字符没有这个问题. (19认同)
  • 改变@ +&的酷炫技巧+1.您可以使用`.parameterize`删除非alpha(等)删除. (2认同)

Gar*_*ett 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
Run Code Online (Sandbox Code Playgroud)

非常自我解释,虽然唯一的问题是如果已经有相同的问题,它将不会是name-01或类似的东西.

例:

".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
Run Code Online (Sandbox Code Playgroud)

输出: -downcase-gsub-a-z1-9-chomp


Vic*_*r S 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
Run Code Online (Sandbox Code Playgroud)


Til*_*ilo 6

Unicode gem 自 2007 年以来就没有更新过。

我推荐 stringex gem,它包含 Unidecoder gem 的功能。

https://github.com/rsl/stringex

看它的源码,似乎是对Unidecoder源码进行了重新打包,并添加了新的功能。


Mar*_*rom 6

我的应用程序的主要问题是撇号 - 很少你想让-s坐在那里自己.

class String

  def to_slug
    self.gsub(/['`]/, "").parameterize
  end

end
Run Code Online (Sandbox Code Playgroud)