Rails开发环境下无法正常渲染public目录下ERB格式404模板的问题
问题根因
- 你直接用
render :file指向public目录下的ERB文件不符合Rails的模板处理约定:public目录默认用于存放静态资源,Rails不会主动将该目录下的文件作为动态模板解析。 - 开发环境默认开启了静态文件服务调试逻辑,未明确指定响应内容类型时,会将
.erb后缀的文件识别为纯文本,自动包裹<pre>标签返回原始内容,方便开发者调试静态文件。 - 生产环境默认关闭了Rails层面的静态文件服务,该渲染逻辑不会触发静态文件处理流程,会直接读取文件内容返回,所以不会出现
<pre>包裹的问题。
解决方案
方案1(推荐,符合Rails约定)
将404.html.erb移动到app/views/errors/目录下,修改渲染逻辑为指定模板渲染即可,ERB语法会被正常解析,实例变量@fail_photo也可以正常传入模板使用:
render({ template: 'errors/404', layout: false, status: :not_found })
该方案开发、生产环境表现一致,无需额外适配配置。
方案2(保留文件存放在public目录)
如果出于特殊需求必须把文件放在public目录下,渲染时明确指定ERB解析器和HTML内容类型即可:
render({ file: Rails.root.join("public", "404.html.erb"), layout: false, status: :not_found, handlers: [:erb], # 强制使用ERB解析文件 content_type: 'text/html' # 明确返回内容为HTML,避免被识别为纯文本 })
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

