如何修改Rails中render_to_string方法的模板查找路径?
解决Rails中
render_to_string自定义模板路径的问题 你可以通过两种方式修改render_to_string的模板查找路径,不需要把模板放在app/views下:
方法1:添加自定义视图查找路径
通过给控制器实例添加自定义视图路径,让ActionView优先在指定目录下查找模板:
def query(params:, file_path:) controller = ActionController::Base.new # 将自定义目录添加到视图查找路径的最前端 controller.prepend_view_path(Rails.root.join('app', 'domains')) controller.render_to_string( layout: false, template: "fulfillment/#{file_path}", # 路径相对于新增的app/domains目录 locals: params, ).strip end
这样设置后,ActionView会先在app/domains下查找模板,再去默认的app/views查找。
方法2:直接指定模板文件的绝对路径
使用file选项替代template参数,直接传入模板的完整绝对路径:
def query(params:, file_path:) ActionController::Base.new.render_to_string( layout: false, file: Rails.root.join('app', 'domains', 'fulfillment', file_path), locals: params, ).strip end
这种方式不需要修改视图查找路径,直接定位到目标模板文件,适合单个或少量非默认路径的模板场景。
为什么原来的写法会报错?
render_to_string的template参数是基于ActionView的默认查找路径(默认仅包含app/views)来解析的,直接传入app/domains/...这种路径会被当成相对于app/views的子路径,自然找不到模板文件,所以需要用上述两种方式调整。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

