2016-01-10 1 views
1

Я использую Friendly-Idgem для создания симпатичных URL-адресов. Я хотел бы создать чувствительные к регистру URL-адреса и перенаправить все другие версии одного и того же URL-адреса по умолчанию с статусом 301.Как сделать чувствительные к регистру URL-адреса с Rails/Friendly-Id?

/profile/Jack-Wild # default URL 
/profile/jack-wild # redirect to /profile/Jack-Wild 
/profile/jaCk-Wild # redirect to /profile/Jack-Wild 

Friendly_Id слизни downcase, и только спичка и принимает downcase URL-адрес, 404 ИНГ всего остального.

Возможное решение: поддерживать slug_case_sensitive (Jack-Wild), а также версию по умолчанию slug (jack-wild).

Затем сделать Friendly_Id поиска по slug колонке с params[:id].downcase и если params[:id] != slug_case_sensitive перенаправление с предпочтительной URL (/profile/slug_case_sensitive).

Это моя идея о том, как добиться этого, с помощью нескольких головоломок отсутствует, надеясь кто-то может помочь их заполнению.

Измените Методы создания и обновления пули, чтобы создавать и обновлять обе версии сгустка. Это будет только один метод: set_slug:

# Sets the slug. 
def set_slug(normalized_slug = nil) 
    if should_generate_new_friendly_id? 
    candidates = FriendlyId::Candidates.new(self, normalized_slug || send(friendly_id_config.base)) 
    slug = slug_generator.generate(candidates) || resolve_friendly_id_conflict(candidates) 
    send "#{friendly_id_config.slug_column}=", slug 
    end 
end 
private :set_slug 

Пусть пробкового не downcased. Если изменение: send "#{friendly_id_config.slug_column}=", slug с: send "#{friendly_id_config.slug_column}=", slug.downcase send "#{friendly_id_config.slug_column_case_sensitive}=", slug быть достаточно? Также, как добавить и установить friendly_id_config.slug_column_case_sensitive вариант?

И затем, измените user_path(@user) и <%= link_to "My profile", current_user %>, чтобы вернуть URL-адрес, чувствительный к регистру. Но не знаю лучшего способа, чем user_path(id:@user.slug_case_sensitive), который является уродливым, а также я должен был бы изменить его повсюду и не уверен, что это можно сделать в сторонних драгоценных камнях ...

Любые идеи по этому вопросу помогут и будут высоко оценены , Благодаря!

ответ

1

Возможно, в этой ситуации может быть применен другой подход: скорее всего, вы будете использовать приложение Rails для Nginx в качестве прокси. Затем можно переписать все запросы для профилей с перевернутыми буквами в них в каноническом варианте. Это будет быстрее, чем создание дополнительных запросов БД и использование целого Rails-стека. Также его было бы намного проще реализовать.

+0

Это не только первые буквы, которые я пытаюсь получить, возможно, примеры использовались не лучшим образом, это не просто/профиль/Джон-Смит, но также и профиль/JonFK. И на самом деле имеет смысл использовать чувствительные к регистру URLS, потому что/profile/JonFK имеет значение, а/profile/Jonfk - не так много – Catalin

0

Вы можете переопределить метод normalize_friendly_id в модели:

def normalize_friendly_id(value) 
    value.to_s.parameterize(preserve_case: true) 
end 

Он опирается на ActiveSupport parameterize, который принимает preserve_case вариант.

Смежные вопросы