Rails friendly_id удаляет не ascii символы для генерации URL - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу автоматически генерировать слаг на основе названия и автора книги, который может быть на любом языке. Используя friendly_id с rails, и когда есть символы не ascii, он просто удаляет их. Я знаю, что технически могу включить, кодируя их следующим образом:

class Resource < ApplicationRecord
  extend FriendlyId
  friendly_id :title_and_author, use: :slugged

  def title_and_author
    "#{URI::encode(title)} by #{URI::encode(author)} #{language.language} book"
  end
end

Это приводит к длинной строке, которая не удобна для пользователя d0-9b-d0-b5-d0-b4-d0-b8-20-d0-9c-d0-b0-d0-ba-d0-b1-d0-b5-d1-82-20-d0-9c-d1-86-d0-b5-d0-bd-d0-ba-d0-be-d0-b3-d0-be-20-d1-83-d0-b5-d0-b7-d0-b4-by-d0-9c-d0-b0-d1-82-spanish-book

Я хочу, чтобы в URL были слова в родной скрипт, а не закодированная версия. Как слаг может включать русский, японский, китайский и т. Д. c? Я также видел много постов, предлагающих включить гем перевода , но должно быть проще просто сохранить символы ?? Почему это удаление символов в первую очередь?

ОБНОВЛЕНИЕ 1 Благодаря комментарию ниже, вот рабочая модель:

class Resource < ApplicationRecord
  extend FriendlyId
  friendly_id :title_and_author, use: :slugged

  def title_and_author
    "#{title} by #{author} #{language.language} book"
  end

  def normalize_friendly_id(string)
    string.gsub(" ", "-")
  end
end

ОБНОВЛЕНИЕ 2: Хорошо, русский и немецкий B сейчас работает нормально, но китайские иероглифы сейчас вызывают проблемы. В базе данных слаг будет сохранен как "/哈利波特百科全书-by-J.-K.-Rowling-Chinese-(Mandarin)-book-ed265df6-73d2-4b87-9326-524c2684756d", но когда я go на страницу, URL говорит http://localhost:3000/resources/%2F%E5%93%88%E5%88%A9%E6%B3%A2%E7%89%B9%E7%99%BE%E7%A7%91%E5%85%A8%E4%B9%A6-by-J.-K.-Rowling-Chinese-(Mandarin)-book-ed265df6-73d2-4b87-9326-524c2684756d и выдает ошибку No route matches [GET]. Даже если я скопирую и вставлю http://localhost:3000/resources/%E5%93%88%E5%88%A9%E6%B3%A2%E7%89%B9%E7%99%BE%E7%A7%91%E5%85%A8%E4%B9%A6-by-J.-K.-Rowling-Chinese-(Mandarin)-book-ed265df6-73d2-4b87-9326-524c2684756d в браузер, я все равно получаю сообщение об ошибке без маршрута.

ОБНОВЛЕНИЕ 3 Я понимаю, что это больше, чем я предполагал изначально. Я нашел статьи о людях, спрашивающих, как обращаться с другими сценариями, такими как Китайский , Корейский , Арабский c и др. c. но все они предлагают перевести этот конкретный c язык. Разве нет драгоценного камня или способа включить какой-либо язык в URL?

Я видел это Бабоса самоцвет , но у него нет азиатских сценариев

1 Ответ

1 голос
/ 28 апреля 2020

По умолчанию FriendlyId использует метод paramaterize Active Support для создания слагов. Этот метод будет разумно заменять пробелы тире, а латинские символы Unicode - ASCII-аппроксимациями:

movie = Movie.create! :title => "Der Preis fürs Überleben"
movie.slug #=> "der-preis-furs-uberleben"

http://norman.github.io/friendly_id/file.Guide.html#Working_With_Slugs

Вы можете переопределить генерацию слага переопределить метод #normalize_friendly_id:

class User < ActiveRecord::Base
  friendly_id :name

  def normalize_friendly_id(string)
    string
  end
end

Почему он вообще убирает символы?

Он известен как транслитерация и сделан для совместимости. причины. Хотя современные браузеры поддерживают символы UTF-8 в URL-адресах, это не всегда имело место, а поддержка на стороне сервера также была нечеткой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...