Лучший способ генерировать пули (удобочитаемые идентификаторы) в Rails
Вы знаете, как myblog.com/posts/donald-e-knuth.
Должен ли я сделать это со встроенным методом parameterize
?
Как насчет плагина? Я мог представить, что плагин хорош для обработки дубликатов слизней и т.д. Вот некоторые популярные плагины Github - есть ли у кого-нибудь опыт с ними?
В принципе, похоже, что пули - это полностью решенная проблема, и я не изобретаю велосипед.
Ответы
Ответ 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