myblog.com/posts/donald-e-knuth のように。
組み込みparameterize
メソッドでこれを行う必要がありますか?
プラグインはどうですか?プラグインが重複したスラッグなどを処理するのに適していると想像できます.ここにいくつかの人気のあるGithubプラグインがあります-誰もそれらの経験がありますか?
基本的に、ナメクジは完全に解決された問題のようであり、車輪の再発明はしません。
myblog.com/posts/donald-e-knuth のように。
組み込みparameterize
メソッドでこれを行う必要がありますか?
プラグインはどうですか?プラグインが重複したスラッグなどを処理するのに適していると想像できます.ここにいくつかの人気のあるGithubプラグインがあります-誰もそれらの経験がありますか?
基本的に、ナメクジは完全に解決された問題のようであり、車輪の再発明はしません。
スラッグを生成する最良の方法は、Unidecode 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を参照してください。
私は以下を使用します。
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"
これが私が使用するものです:
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
誰かが興味を持っている場合は、アンダースコアの代わりにダッシュを作成するように少し変更しました。
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
私のアプリの主な問題はアポストロフィでした。
class String
def to_slug
self.gsub(/['`]/, "").parameterize
end
end
Unidecoder gem は 2007 年以来更新されていません。
Undecoder gem の機能を含む stringex gem をお勧めします。
https://github.com/rsl/stringex
ソース コードを見ると、Unidecoder ソース コードを再パッケージ化して新しい機能を追加しているようです。
最近、私は同じジレンマを抱えていました。
あなたのように、私は車輪の再発明をしたくないので、Ruby Toolbox:Rails Permalinks&Slugsでの比較に続いてfriendly_idを選択しました。
私は以下に基づいて決定しました:
これが決定を下すのに役立つことを願っています。
to_slug を使用しますhttp://github.com/ludo/to_slug/tree/master
。必要なことはすべて実行します (「ファンキーな文字」をエスケープします)。お役に立てれば。
編集:私のリンクを壊しているようです、申し訳ありません。
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 では、初期化子 slug.rb を作成し、次のコードを挿入しました。
class String
def to_slug
ActiveSupport::Inflector.transliterate(self.downcase).gsub(/[^a-zA-Z0-9]+/, '-').gsub(/-{2,}/, '-').gsub(/^-|-$/, '')
end
end
次に、コード内の任意の場所で使用します。任意の文字列に対して定義されています。
文字変換は、é,á,ô のようなものを e,a,o に変換します。私はポルトガル語でサイトを開発しているので、それは重要です。
この質問には時間がかかることはわかっています。しかし、比較的新しい答えがいくつか見られます。
データベースにスラッグを保存するのは問題があり、すでに存在する冗長な情報を保存します。考えてみれば、ナメクジを保存する理由はありません。スラッグはデータではなくロジックである必要があります。
私はこの理由付けに従って投稿を書きました。