我有一个双命名空间的情况,我的控制器看起来像这样:
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”路由;即。我们有很多行动,没有命名路线可以回退。
答案 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中修复了此问题。