如何为 rails 控制器对象设置假请求对象
How to set fake request object for rails controller object
我需要在控制器外使用render_to_string方法。
所以我像这样创建控制器实例:
controller = class_name.constantize.new # Rails controller instance
controller.params = params
controller.action_name = 'index'
controller.create_global_current_user user
index_render_options = controller.send('index_render_options')
controller.send('render_to_string', index_render_options)
但是失败了,因为里面的request对象是nil。你能帮我吗?如何为控制器对象创建虚假请求?
已解决。
已添加
controller.request = ActionDispatch::Request.new({})
resp = controller.class.make_response!(controller.request)
controller.set_response!(resp)
所以现在看起来像
controller = class_name.constantize.new
controller.params = params
controller.action_name = 'index'
controller.request = ActionDispatch::Request.new({})
resp = controller.class.make_response!(controller.request)
controller.set_response!(resp)
controller.create_global_current_user user
index_render_options = controller.send('index_render_options')
controller.send('render_to_string', index_render_options)
基于 this blog post env 参数看起来像
env = {
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/hello',
'HTTP_HOST' => 'skylight.io',
# ...
}
由于 Rails 不允许将空映射作为 env
参数,因此创建请求对象的最少代码为
request = ActionDispatch::Request.new({ "REQUEST_METHOD" => "GET" })
我需要在控制器外使用render_to_string方法。 所以我像这样创建控制器实例:
controller = class_name.constantize.new # Rails controller instance
controller.params = params
controller.action_name = 'index'
controller.create_global_current_user user
index_render_options = controller.send('index_render_options')
controller.send('render_to_string', index_render_options)
但是失败了,因为里面的request对象是nil。你能帮我吗?如何为控制器对象创建虚假请求?
已解决。
已添加
controller.request = ActionDispatch::Request.new({})
resp = controller.class.make_response!(controller.request)
controller.set_response!(resp)
所以现在看起来像
controller = class_name.constantize.new
controller.params = params
controller.action_name = 'index'
controller.request = ActionDispatch::Request.new({})
resp = controller.class.make_response!(controller.request)
controller.set_response!(resp)
controller.create_global_current_user user
index_render_options = controller.send('index_render_options')
controller.send('render_to_string', index_render_options)
基于 this blog post env 参数看起来像
env = {
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/hello',
'HTTP_HOST' => 'skylight.io',
# ...
}
由于 Rails 不允许将空映射作为 env
参数,因此创建请求对象的最少代码为
request = ActionDispatch::Request.new({ "REQUEST_METHOD" => "GET" })