web-dev-qa-db-ja.com

Railsでスラッグ(人間が読み取れるID)を生成する最良の方法

Myblog.com/posts/donald-e-knuthなどです。

組み込みのparameterizeメソッドでこれを行う

プラグインはどうですか?プラグインが重複したスラッグなどを処理するのに適していると想像できます。人気のあるGithubプラグインをいくつか紹介します。

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

基本的に、ナメクジは完全に解決された問題のようで、私は車輪を再発明する必要はありません。

61
Tom Lehman

私は以下を使用します

  • 変換&-> "and"および@-> "at"
  • アポストロフィの代わりにアンダースコアを挿入しないため、「foo's」->「foos」
  • 二重アンダースコアは含まれません
  • アンダースコアで始まるまたは終わるスラグを作成しません

  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"
36
klochner

In Railsを使用できます #parameterize

例えば:

> "Foo bar`s".parameterize 
=> "foo-bar-s"
213
grosser

ナメクジを生成する最良の方法は、 nidecode gem を使用することです。これは、利用可能な最大の音訳データベースを持っています。漢字の音訳もあります。もちろん、すべてのヨーロッパ言語(現地の方言を含む)をカバーしています。防弾スラッグの作成を保証します。

たとえば、それらを考慮してください:

"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 をご覧ください。

51

私が使用するものは次のとおりです。

class User < ActiveRecord::Base
  before_create :make_slug
  private

  def make_slug
    self.slug = self.name.downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
  end
end

かなり自明ですが、これに関する唯一の問題は、既に同じものがある場合、name-01またはそのようなものではないことです。

例:

".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')

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

9
Garrett

私のアプリの主な問題はアポストロフィでした-めったにあなたが望みませんか?.

class String

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

end
6
Mark Swardstrom

誰かが興味がある場合は、アンダースコアの代わりにダッシュを作成するように少し変更しました:

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
6
Victor S

Unidecoder gemは2007年以降更新されていません。

Unidecoder gemの機能を含むstringex gemをお勧めします。

https://github.com/rsl/stringex

ソースコードを見ると、Unidecoderソースコードを再パッケージ化し、新しい機能を追加しているようです。

4
Tilo

to_slughttp://github.com/ludo/to_slug/tree/master。必要なことはすべて行います(「ファンキーなキャラクター」をエスケープします)。お役に立てれば。

編集:私のリンクを壊しているようだ、それについて申し訳ありません。

3
theIV

最近、私は同じジレンマを抱えていました。

あなたと同じように、私は車輪を再発明したくないので、friendly_id上の比較に従って Ruby Toolbox:Rails Permalinks &ナメクジ

私の決定の根拠は次のとおりです。

  • githubウォッチャーの数
  • 番号。 githubフォークの
  • 最後にコミットされたのはいつですか
  • 番号。ダウンロードの

これが意思決定に役立つことを願っています。

3
Marius Butuc

私は、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

明らかに、実行するオブジェクトのインスタンスメソッドとして追加する必要がありますが、わかりやすくするために追加しませんでした。

2
coreyward

Rails 3、

class String
  def to_slug
    ActiveSupport::Inflector.transliterate(self.downcase).gsub(/[^a-zA-Z0-9]+/, '-').gsub(/-{2,}/, '-').gsub(/^-|-$/, '')
  end
end

次に、コード内の任意の場所で使用し、任意の文字列に対して定義されます。

文字変換は、é、á、ôのようなものをe、a、oに変換します。ポルトガル語でサイトを開発しているので、それは重要です。

0