Rails 6渲染js.erb视图报html_fallback_for_js未定义错误如何解决
错误成因
这个报错是Rails 6对ActionView渲染逻辑做了两处调整导致的:
- 不再支持直接给
ActionView::Base构造方法传入字符串类型的视图根路径,要求传入标准的ActionView::LookupContext查找上下文对象 - 渲染逻辑新增了格式 fallback 校验,在未显式指定渲染格式时,会尝试对模板路径调用
html_fallback_for_js方法生成html格式的兜底路径,你传入的字符串路径没有实现这个方法,就抛出了NoMethodError
解决方法
有两种可行的实现方案,都可以正常渲染js.erb模板:
方案1:沿用ActionView::Base手动渲染的写法
调整初始化和渲染参数,显式指定渲染格式跳过fallback逻辑:
# 构造标准视图查找上下文 lookup_context = ActionView::LookupContext.new(Rails.root.join('app', 'views')) lookup_context.formats = [:js] av = ActionView::Base.new(lookup_context) # 赋值变量 av.assign(foo: my_dynamic_variable) # 渲染时显式指定js格式 render_result = av.render(template: 'js/library', formats: [:js])
方案2:使用Rails内置的控制器静态渲染方法(更简洁)
Rails 5之后新增了控制器类级别的render方法,不需要手动构造ActionView实例,会自动继承应用全局的helper、上下文配置,适配性更强:
render_result = ApplicationController.render( template: 'js/library', assigns: { foo: my_dynamic_variable }, formats: [:js] )
内容的提问来源于stack exchange,提问作者aarkerio
相关产品推荐
相关产品推荐

