在this Stack Overflow question中,问题的结尾开始解决这个问题,但这不是主要问题,已在那里得到解答。
我有一个模块,包含在ApplicationController
和MyEngineController
中。假设某些模块的实例方法使用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
记录很少。任何人都可以解释它应该做什么吗?)
答案 0 :(得分:2)
目前,我正在使用此解决方案(在MyEngineController中):
protected
def url_for options=nil
begin
super options
rescue ActionController::RoutingError
main_app.url_for options
end
end
我不喜欢它,因为一般来说,exceptions shouldn't be used for flow control。那你有什么其他的建议呢?