Myblog.com/posts/donald-e-knuthなどです。
プラグインはどうですか?プラグインが重複したスラッグなどを処理するのに適していると想像できます。人気のあるGithubプラグインをいくつか紹介します。
基本的に、ナメクジは完全に解決された問題のようで、私は車輪を再発明する必要はありません。
私は以下を使用します
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"
ナメクジを生成する最良の方法は、 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 をご覧ください。
私が使用するものは次のとおりです。
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
私のアプリの主な問題はアポストロフィでした-めったにあなたが望みませんか?.
class String
def to_slug
self.gsub(/['`]/, "").parameterize
end
end
誰かが興味がある場合は、アンダースコアの代わりにダッシュを作成するように少し変更しました:
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
Unidecoder gemは2007年以降更新されていません。
Unidecoder gemの機能を含むstringex gemをお勧めします。
https://github.com/rsl/stringex
ソースコードを見ると、Unidecoderソースコードを再パッケージ化し、新しい機能を追加しているようです。
to_slughttp://github.com/ludo/to_slug/tree/master
。必要なことはすべて行います(「ファンキーなキャラクター」をエスケープします)。お役に立てれば。
編集:私のリンクを壊しているようだ、それについて申し訳ありません。
最近、私は同じジレンマを抱えていました。
あなたと同じように、私は車輪を再発明したくないので、friendly_id上の比較に従って Ruby Toolbox:Rails Permalinks &ナメクジ 。
私の決定の根拠は次のとおりです。
これが意思決定に役立つことを願っています。
私は、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
明らかに、実行するオブジェクトのインスタンスメソッドとして追加する必要がありますが、わかりやすくするために追加しませんでした。
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に変換します。ポルトガル語でサイトを開発しているので、それは重要です。