Перенаправление с контроллера пространства имен с помощью хэша - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть ситуация с двойным пространством имен, где мои контроллеры выглядят так:

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 (т. Е. Без использования помощника пути)?

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

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Если кто-то еще сталкивается с этой проблемой, это, кажется, известная проблема (неуверенно, считают ли они это ошибкой или нет, учитывая отсутствие ответа на странице проблемы от всех, кто работает на 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 здесь .

0 голосов
/ 14 декабря 2011

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

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

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

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

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


У некоторых людей такая же проблема: https://github.com/rails/rails/issues/2575

Исправление: actionpack / lib / action_dispatch / routing / route_set.rb строка 434 это исправляется следующим образом: if! named_route && different_controller? && ! Controller.starts_with? ( '/')

...