@Fly3110
web developer

Как правильно переорпеделить именованные маршруты в rails 4?

Всем привет.

Есть приложение на rails. И основной сайт под управлением этого приложения. Все ссылки на этом сайте без ЧПУ.
Делаем на основе нашего приложения персональный сайт для одного из клиентов (дизайн - его собственный, функционал наш).
Желание клиента - иметь ссылки с ЧПУ. Изменить ссылки глобально не представляется возможным, так как они используются и вне нашего сайта. Ок, создаем дубли наших маршрутов с использованием префикса. То есть был маршрут с именем index, появился новый с именем clientname_index и так далее.
Но во многих action'ах используются вызовы хелперов для именованых маршрутов. Ставить везде условия о том, какой хелпер вызывать - колхозом пахнет :)

Поэтому было принято решение в application_controller добавить следующую конструкцию:
def set_template_and_vars
    if '%clients_domain%' == request.host
      params[:template] = 'clients_template'

      %w(index project ...куча других имен маршрутов).each do |name|
        self.class.send('define_method', ("#{name}_path")) { |arguments| send("clientname_#{name}_path", arguments) }
      end

    end
  end


но, почему-то кажется, что можно сделать более правильно.
Какие минусы есть у этого решения и как сделать более правильно?

Заранее спасибо.
  • Вопрос задан
  • 299 просмотров
Пригласить эксперта
Ответы на вопрос 2
@vsuhachev
Ставить везде условия о том, какой хелпер вызывать - колхозом пахнет :)


Нужно в роутинг-хэлперы передавать некую переменную, которая будет определять как вычислять роуты в зависимости от. Для клиента она будет содержать значение, для вашей организации будет пустая. По-моему это самый верный путь.
Ответ написан
viktorvsk
@viktorvsk
Пожалуйста, хотя бы в Rails не переносите этот станок с числовым программным управлением.
В чем такая проблема?
Про этот метод слышали? Не помогает?

А так же про globs и constraints?

Напишите, чего хотите добиться и почему не получается это сделать стандартными методами Rails
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы