升级Rails 6.1后render_to_string传绝对路径报错如何修正
Rails 6.1 中 render_to_string 路径传参说明
Rails 6.1 版本正式移除了对传入绝对路径(以/开头的路径)渲染模板/布局的支持,你遇到的ArgumentError: Rendering layouts from an absolute path is not supported异常就是因为传入的模板路径带了开头的斜杠导致的。
正确传参写法
- 最简便的改法:直接去掉路径开头的斜杠,传入基于
app/views目录的相对路径即可,修改后的代码如下:
CreatePdf.new(content: render_to_string('pdfs/books/show')).call
- 更稳妥的显式写法:通过
template:参数明确声明要渲染的是普通模板文件,避免Rails的渲染规则自动匹配出错:
CreatePdf.new(content: render_to_string(template: 'pdfs/books/show')).call
- 如果要渲染的是带下划线前缀的局部视图,使用
partial:参数声明,路径同样不要带开头斜杠:
# 对应渲染 app/views/pdfs/books/_show.html.erb 这类局部文件 render_to_string(partial: 'pdfs/books/show')
注意事项
- 传入的路径不需要写文件后缀,Rails会自动根据当前渲染的格式匹配对应后缀的模板文件(比如
.html.erb、.pdf.erb、.axlsx.erb等) - 所有传给
render_to_string的模板/局部视图/布局路径都不要带开头的/,否则都会触发绝对路径不支持的报错 - 如果需要给模板传递本地变量,可以搭配
locals:参数传入:
render_to_string('pdfs/books/show', locals: { current_book: @book })
内容的提问来源于stack exchange,提问作者zx2322
相关产品推荐
相关产品推荐

