使用哈希从命名空间控制器重定向

时间:2011-12-13 21:21:03

标签: ruby-on-rails-3 routing namespaces

我有一个双命名空间的情况,我的控制器看起来像这样:

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 :(得分:0)

我想知道是否有其他错误。在doc:

  

特别是,前导斜杠确保不会假定名称空间。从而,   而url_for:controller =&gt; '用户'可以解决   Admin :: UsersController,如果当前控制器位于其下   module,url_for:controller =&gt; '/ users'确保您链接到   :: UsersController无论如何。

我认为它没有改变......

此外,catch-all路由不应该在配置中的默认路由之后吗?

我认为redirect_to:controller =&gt; ...使用url_for来构建网址,所以最后,如果你的自定义路线捕获/候选人,我真的没有看到差异。


有些人遇到同样的问题:https://github.com/rails/rails/issues/2575

  

修补actionpack / lib / action_dispatch / routing / route_set.rb第434行   如下修复:if!named_route&amp;&amp; different_controller? &安培;&安培;   !controller.starts_with?( '/')

答案 1 :(得分: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中修复了此问题。