2

这个 Stack Overflow question中,问题的结尾开始解决这个问题,但这不是主要问题,那里已经回答了。

我有一个包含在ApplicationControllerMyEngineController. 假设某些模块的实例方法使用login_url或其他一些命名路由。它适用于 ApplicationController 但不适用于MyEngineController. 我可以用 替换它main_app.login_url,这将使它对两者都有效,但这似乎非常冗长,而且无论如何,如果代码已经是 gem 依赖项的一部分怎么办?我如何使它在我正在编码的引擎中事后工作?

当我尝试使用任何命名的助手时,这就是我得到的:

ActionController::RoutingError: 
    No route matches {:action=>"new", :controller=>"sessions"}
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:532:in `raise_routing_error'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:528:in `rescue in generate'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:520:in `generate'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:561:in `generate'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:586:in `url_for'
actionpack-3.2.8/lib/action_dispatch/routing/url_for.rb:148:in `url_for'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:213:in `login_url'

请注意,:controller=>"sessions"必须是:controller=>"/sessions"(使用斜线将其放在根名称空间中),但这不是我可以传递给命名路由 AFAIK 的选项。我尝试添加此代码:

extend ActiveSupport::Concern
included do
  main_app.install_helpers(self)
end

在 MyEngineController 中,但它没有帮助。(install_helpers记录得很差。谁能解释它应该做什么?)

4

1 回答 1

2

现在,我将使用这个解决方案(在 MyEngineController 中):

protected
def url_for options=nil
  begin
    super options
  rescue ActionController::RoutingError
    main_app.url_for options
  end
end

我不太喜欢它,因为一般来说,异常不应该用于流控制。那么你还有什么其他建议?

于 2012-10-15T02:36:25.790 回答