2011-12-13 2 views
0

У меня есть ситуации двойного пространства имен, где мои контроллеры выглядеть следующим образом:Перенаправление из пространства имен контроллера с использованием хэш

CandidateController 
Candidate::PerformanceController 
Candidate::Performance::ReviewController 

В Rails 2, я был в состоянии использовать redirect_to от контроллера Candidate::Performance::ReviewController для того, чтобы перенаправить к действию в CandidateController, например, так:

class Candidate::Performance::ReviewController < ApplicationController 

    before_filter :ensure_manager 

    # ... 

    def ensure_manager 
    if !current_user.manager? 
     flash[:warning] = t(:must_be_manager) 
     redirect_to :controller => '/candidate', :action => :index 
    end 
    end 
end 

/ в controller => '/candidate' позволит Rails перенаправлять от app.com/performance/reviews к app.com/candidate.

Однако, похоже, что это не работает в Rails 3.1. Вместо этого мой redirect_to отправляется в app.com/candidate//candidate. Каков правильный способ указания «абсолютного» контроллера в хеше redirect_to (т. Е. Без использования помощника пути)?

Update: Я знаю, что это было бы гораздо проще, если бы я просто использовать именованные маршрутные хелперы (т.е. candidate_path.). К сожалению, в нашей кодовой базе много устаревшего кода, который не использует маршрутизацию RESTful и вместо этого использует стандартный маршрут «catch-all»; то есть. у нас есть много действий без названного маршрута для возврата.

ответ

0

Если кто-то бежит в эту проблему, она, кажется, known issue (неуверен, считают ли они это ошибка или нет, учитывая отсутствие ответа на страница с вопросом от любого, кто работает с Rails).

Пока они не исправить ее (при условии, что они делают), я добавил следующую маленькую обезьяну заплату в инициализатор, основанный на коде, приведенной в исходном посте этого вопроса:

module ActionDispatch 
    module Routing 
    class RouteSet 
     class Generator 
     def use_relative_controller_with_absolute_paths! 
      return if controller.starts_with?('/') 
      use_relative_controller_without_absolute_paths! 
     end 

     alias_method_chain :use_relative_controller!, :absolute_paths 
     end 
    end 
    end 
end 

Надеется, что это может помогите кому-то еще!

Обновление: Похоже, что это было исправлено в Rails here.

+0

Просто нашел тот же пост при поиске документа. Угадайте, что url_for, на который я смотрел, в документе был устаревшим. http://apidock.com/rails/ActionController/Base/url_for – Robin

0

Интересно, что-то еще не так. В документе:

В частности, ведущая косая черта не гарантирует, что пространство имен не предполагается. Таким образом, , в то время как url_for: controller => 'users' может разрешить Admin :: UsersController, если текущий контроллер живет под этим модулем , url_for: controller => '/ users' гарантирует, что вы ссылаетесь на :: UsersController независимо от того, что ,

И я не думаю, что изменилось ...

Кроме того, не улов-все маршруты будут после маршрутов по умолчанию в вашей конфигурации?

Я думаю, что redirect_to: controller => ... использует url_for для создания URL-адреса, поэтому в конце, если ваши пользовательские маршруты пойманы/кандидаты, я действительно не вижу разницы.


Некоторые люди имеют те же проблемы: https://github.com/rails/rails/issues/2575

Заделка actionpack/Библиотека/action_dispatch/маршрутизации/route_set.rb линии 434 следующим образом исправляет это: если named_route & & different_controller? & & ! Controller.starts_with? («/»)

+0

К сожалению, я только что прочитал ваш вопрос еще раз и понял, что :( – Robin

+0

Мой всеохватывающий маршрут находится в нижней части моего routes.rb файла. –

+0

Итак, в чем проблема с использованием помощника candidate_url снова? – Robin

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