67

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

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

4

12 に答える 12

239

Rails では#parameterizeを使用できます

例えば:

> "Foo bar`s".parameterize 
=> "foo-bar-s"
于 2011-10-14T14:32:39.230 に答える
52

スラッグを生成する最良の方法は、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を参照してください。

于 2010-02-13T23:46:51.000 に答える
38

私は以下を使用します。

  • & --> "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"
于 2009-08-19T19:35:59.913 に答える
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

かなり自明ですが、これに関する唯一の問題は、同じものがすでに存在する場合ですが、name-01などではありません。

例:

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

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

于 2009-08-19T19:15:56.820 に答える
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
于 2011-10-09T23:40:42.973 に答える
6

私のアプリの主な問題はアポストロフィでした。

class String

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

end
于 2013-08-30T22:39:23.927 に答える
4

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

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

https://github.com/rsl/stringex

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

于 2012-04-30T14:23:05.883 に答える
3

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

あなたのように、私は車輪の再発明をしたくないので、Ruby Toolbox:Rails Permalinks&Slugsでの比較に続いてfriendly_idを選択しました。

私は以下に基づいて決定しました:

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

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

于 2011-01-19T17:52:26.747 に答える
3

to_slug を使用しますhttp://github.com/ludo/to_slug/tree/master。必要なことはすべて実行します (「ファンキーな文字」をエスケープします)。お役に立てれば。

編集:私のリンクを壊しているようです、申し訳ありません。

于 2009-08-19T19:10:36.207 に答える
2

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

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

于 2011-02-16T01:49:17.893 に答える
0

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 に変換します。私はポルトガル語でサイトを開発しているので、それは重要です。

于 2012-06-15T21:20:37.887 に答える
-2

この質問には時間がかかることはわかっています。しかし、比較的新しい答えがいくつか見られます。

データベースにスラッグを保存するのは問題があり、すでに存在する冗長な情報を保存します。考えてみれば、ナメクジを保存する理由はありません。スラッグはデータではなくロジックである必要があります。

私はこの理由付けに従って投稿を書きました。

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

于 2012-05-16T12:53:23.350 に答える