使用JBuilder触发NameError:未定义presenter变量或方法
问题分析与解决
错误核心原因
报错undefined local variable or method 'presenter'的本质是:你的JBuilder模板里根本没获取到presenter这个变量。JBuilder模板默认只能访问控制器传递的带@前缀的实例变量,或者通过locals明确传入的局部变量。如果控制器没传presenter这个局部变量,不管你写成多行还是单行判断,都会找不到它。
可行修复方案
方案1:直接使用控制器传递的实例变量
如果控制器里是用@presenter传递数据的,直接修改JBuilder代码,同时保留空值判断避免后续调用报错:
if @presenter.present? json.extract! @presenter.shop, :id, :name json.schedule @presenter.formated_schedule end
方案2:确保控制器传递局部变量presenter
如果一定要用局部变量presenter,需要在控制器渲染模板时,通过locals明确传入这个变量:
# 控制器中的代码示例 def your_action presenter = SomePresenter.new(...) render template: 'your_template.jbuilder', locals: { presenter: presenter } end
之后JBuilder里的代码就能正常使用presenter变量了,建议同时保留空值判断防止空对象调用方法出错:
if presenter.present? json.extract! presenter.shop, :id, :name json.schedule presenter.formated_schedule end
内容的提问来源于stack exchange,提问作者Anna Bozio
相关产品推荐
相关产品推荐

