Внутренние перенаправления с Rails 3 - PullRequest
11 голосов
/ 14 февраля 2011

Я пытаюсь реализовать общую систему тщеславных URL в Rails 3. Общая в том смысле, что URL тщеславия не привязан к конкретной модели.Это похоже на драгоценный камень Тщеславия, где у меня есть VanityUrlController, который получен со всех URL-адресов тщеславия.Разница в том, что я не хочу делать внешнее перенаправление с foo.com/username на foo.com/users/1 или foo.com/product-name на foo.com/products/1.Я хочу, чтобы URL-адрес тщеславия оставался без присмотра, и чтобы VanityUrlContoller выполнял внутреннее перенаправление, имитирующее соответствующее действие show.

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

TargetController.new.process("show", request.env)

Кажется, что начинается обработка нового "запроса", но отсутствуют ключевые элементы ... как и сам объект запроса.

Буду очень признателен за любые мысли или указания.

Обновление:

Я столкнулся с методом диспетчеризации в ActionController, который, кажется, немного продвинул меня вперед.

TargetController.new.dispatch("show", request)

Iу меня две проблемы с этим, 1) он указан как частный метод API, так что если есть другой способ сделать это, я бы предпочел, и 2) даже если он отображает шаблон шоу для TargetController, он жалуетсяо "Отсутствует шаблон vanity_urls / show."

ОБНОВЛЕНИЕ

Вот основы решения, которое мы придумали.Мы делаем некоторые другие вещи, такие как принудительное кодирование и проверка некоторых других специфических для приложения вещей, но это должно быть все, что вам нужно для начала работы.

Это идет в самом низу вашего файла routes.rb, чтобы ваши тщеславные маршруты не работали.не загромождайте другие ваши именованные маршруты.

# Vanity routes.
match ':id', :as => 'vanity', :to => proc { |env|
  id = env["action_dispatch.request.path_parameters"][:id]

  vain_object = <method to find the object you want to display>
  if vain_object.nil?
    # render your 404 page
    'application#404'
  else
    model = vain_object.class.model_name
    # figure out the controller you want to go to 
    controller = [model.pluralize.camelize,"Controller"].join.constantize
    # reset the :id parameter with the id of the object to be displayed
    env["action_dispatch.request.path_parameters"][:id] = vain_object.id
    # do your internal redirect
    controller.action("show").call(env)
  end
}

Вы также должны быть осторожны при создании маршрутов тщеславия, чтобы они не сталкивались с другими вашими контроллерами.Некоторые другие полезные вещи, о которых нужно знать:

Rails.application.routes.routes.any? { |r| r.requirements[:controller] == vanity_url }

, который сообщает вам, если ваш vanity_url имеет то же имя, что и текущий контроллер.

Rails.application.routes.recognize_path("/#{vanity_url}", :method => :get)

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

Конечно, на этом пути есть пара хаков, но это работает как шарм.

1 Ответ

1 голос
/ 21 августа 2012

Попробуйте плагин FriendlyId.Кажется, делать именно то, что вы хотите.Видеоурок: http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

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