Rails引擎 - 如何绕过命名路由的main_app

时间:2012-10-15 02:24:50

标签: ruby-on-rails-3 rails-engines

this 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记录很少。任何人都可以解释它应该做什么吗?)

1 个答案:

答案 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。那你有什么其他的建议呢?