模块内定义的控制器更改其范围内的所有路由
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
如果我在模块中定义一个路由,像这样:
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