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

Вы знаете, как 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

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

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

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

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

Например:

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

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

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

 "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.

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

 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

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

 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 не обновлялся с 2007 года.

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

https://github.com/rsl/stringex

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

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

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

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

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

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

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

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

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

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

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

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

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

Interesting Posts

Преобразование 5.1 аудио в стерео и сохранение обоих треков

Как сохранить словарь в моем файле web.config?

В Windows 10, почему некоторые программы масштабируются на втором мониторе 2.1, но не контролируют 2.2?

Как сделать высокопроизводительный кластер из 2 ноутбуков у меня дома

C # компиляция для 32/64 бит или для любого процессора?

Доступ к переменным статического classа в C ++?

Отправить уведомления на рабочем столе в Chrome или Firefox из закрытого веб-приложения?

Может ли class c ++ включать себя в качестве члена?

Вставить несколько столбцов вместе

Как установить Windows на GPT HDD, с USB

Разбор строки C # LINQ выражение

Возможно ли программно добавить папки на панель быстрого доступа Windows 10 в окне проводника?

Почему мой Windows 7 PC / SSD-накопитель продолжает замерзать?

java-файл с возможностью перемотки назад () / reset ()

Удаление дублированных строк с помощью dplyr

Давайте будем гением компьютера.