Rails3 RSpec тестирует пользовательский маршрут перенаправления вways.rb - PullRequest
4 голосов
/ 17 марта 2011

У меня есть пользовательское перенаправление в моем rout.rb, которое отлично работает на интерфейсе:

match ':hash' => redirect { |params| begin url = Sharing.find_by_short_url(params[:hash]); "/#{url.shareable_type}/#{url.shareable_id}/" rescue '/' end }, :constraints => { :hash => /[a-zA-Z0-9]{7}/ }

Что делает, это берет сокращенный URL-адрес и ищет фактический путь URL-адреса.

Однако мой тест не пройден:

  it "routes GET 'STU1VWX' to stations/1" do
    { :get => "STU1VWX" }.should redirect_to(
      :controller => "stations",
      :action => "show",
      :params => {:id => 1}
    )
  end

С:

  1) Shorter URL redirect routes GET 'STU1VWX' to stations/1
     Failure/Error: { :get => "STU1VWX" }.should route_to(
     ActionController::RoutingError:
       No route matches "/STU1VWX"
     # ./spec/routing_spec.rb:12:in `block (2 levels) in <top (required)>'

Таким образом, проблема изолирована на уровне теста.Я знаю, что мог бы проверить это в тесте контроллера, но, учитывая, что код находится в routs.rb, мне не пришлось бы этого делать.По сути, есть ли причина, по которой с помощью метода route_to не работать в случае перенаправления?

1 Ответ

0 голосов
/ 08 февраля 2012

Похоже, вы говорите, что если вы не можете найти страницу, принадлежащую хэшу, то перенаправьте на "/"

Что-то действительно вонючее в выполнении поиска ActiveRecord в ваших маршрутах.

Если вам нужно перенаправить на определенный контроллер в зависимости от типа общего ресурса, то я бы поместил это как отдельный контроллер с перенаправлением:

match "/:hash" => 'SharableController#redirect':constraints => { :hash => /[a-zA-Z0-9]{7}/ }

, а затем занялся поиском записи.и перенаправить на правильное действие контроллера оттуда:

class SharableController < ApplicationController

  def redirect
    @sharable = Sharable.find_by_sharable_type(params[:hash])
    redirect_to controller: @sharable.sharable_type, action: 'show', id: @sharable.id
  end

end

ИЛИ ... в зависимости от того, насколько похожи действия show:

class SharableController < ApplicationController

  def redirect
    @sharable = Sharable.find_by_sharable_type(params[:hash])
    render template: "#{@sharable.sharable_type.pluralize}/show"
  end

end

Если вы имеете дело только с GET-запросамиЛучше поменяйте местами спичку для получения кстати:

get "/:hash" => 'SharableController#redirect', :constraints => { :hash => /[a-zA-Z0-9]{7}/ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...