Подтвердить что ты не робот

Лучший способ генерировать пули (удобочитаемые идентификаторы) в Rails

Вы знаете, как myblog.com/posts/donald-e-knuth.

Должен ли я сделать это со встроенным методом parameterize?

Как насчет плагина? Я мог представить, что плагин хорош для обработки дубликатов слизней и т.д. Вот некоторые популярные плагины Github - есть ли у кого-нибудь опыт с ними?

В принципе, похоже, что пули - это полностью решенная проблема, и я не изобретаю велосипед.

4b9b3361

Ответ 1

Я использую следующее, которое будет

  • перевести и → "и" и @- > "в"
  • не вставляет подчеркивание вместо апострофа, поэтому "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"

Ответ 2

В Rails вы можете использовать # parameterize

Например:

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

Ответ 3

Лучший способ генерировать пули - использовать Unidecode gem. Это, безусловно, самая большая база данных транслитерации. У него даже транслитерации для китайских иероглифов. Не говоря уже о всех европейских языках (включая локальные диалекты). Он гарантирует создание пуленепробиваемого пули.

Например, рассмотрим те:

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

>> "中文測試".to_slug
=> "zhong-wen-ce-shi"

Я использую его в своей версии метода String.to_slug в моем плагине ruby_extensions. См. ruby_extensions.rb для метода to_slug.

Ответ 4

Вот что я использую:

class User < ActiveRecord::Base
  before_create :make_slug
  private

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

Довольно самоочевидно, хотя единственная проблема с этим - если это уже одно и то же, это не будет имя-01 или что-то в этом роде.

Пример:

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

Выходы: -downcase-gsub-a-z1-9-chomp

Ответ 5

Я немного изменил его, чтобы создать тире вместо подчеркиваний, если кому-то интересно:

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

Основная проблема для моих приложений - это апострофы - редко вы хотите, чтобы -s сидел там сам.

class String

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

end

Ответ 7

Драгоценный камень Unidecoder не обновлялся с 2007 года.

Я бы рекомендовал жемчужину stringex, которая включает в себя функциональность жемчужины Unidecoder.

https://github.com/rsl/stringex

Рассматривая исходный код, он, похоже, переупаковывает исходный код Unidecoder и добавляет новые функции.

Ответ 8

Мы используем to_slug http://github.com/ludo/to_slug/tree/master. Делает все, что нам нужно, чтобы это делать (избегая "фанковых персонажей" ). Надеюсь, это поможет.

EDIT: Кажется, я нарушаю свою ссылку, извините.

Ответ 9

Недавно у меня была та же самая дилемма.

Поскольку, как и вы, я не хочу изобретать колесо, я выбрал friendly_id следующее сравнение на The Ruby Toolbox: Rails Permalinks and Slugs.

Я основывал свое решение на:

  • количество наблюдателей github
  • нет. вилок github
  • когда была последняя сделанная фиксация
  • нет. загрузок

Надеюсь, что это поможет принять решение.

Ответ 10

Я нашел жемчужину Unidecode слишком тяжелым, загрузив почти 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

Очевидно, вы должны добавить его как метод экземпляра для любых объектов, на которых вы его запускаете, но для ясности я этого не сделал.

Ответ 11

С 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. Поскольку я занимаюсь разработкой сайта на португальском языке, это важно.

Ответ 12

Я знаю, что этот вопрос имеет некоторое время. Однако я вижу некоторые относительно новые ответы.

Сохранение пули в базе данных проблематично, и вы сохраняете избыточную информацию, которая уже существует. Если вы думаете об этом, нет причин для спасения пули. Пул должен быть логическим, а не данными.

Я написал сообщение, следуя этим соображениям, и надеюсь, что это поможет.

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