模块内定义的控制器更改其范围内的所有路由

Controller defined inside a module change all routes to its scope

如果我在模块中定义一个路由,像这样:

class DrivenSignupPlugin::AccountController < ApplicationController
  ...
end

然后所有对url_for(包括redirect_to)的调用都会在:controller参数前加上driven_signup_plugin/

这不是期望的行为,因为此控制器在其外部使用了许多路由。例如,render_access_denied 是来自 ApplicationController 的方法。

要解决此问题,请将此方法添加到控制器:

  def default_url_options
    # avoid rails' use_relative_controller!
    {use_route: '/'}
  end 

对于Rails 4.2+,需要更复杂的东西:

  # inherit routes from core skipping use_relative_controller!
  def url_for options
    options[:controller] = "/#{options[:controller]}" if options.is_a? Hash and options[:controller]
    super options
  end 
  helper_method :url_for