【发布时间】:2020-03-28 01:42:43
【问题描述】:
我认为我可以在 Rails 控制器之外使用 Jbuilder。文档是这么说的。
我编写了这个模块,以包含到服务对象中。它集成在 Rails 6 api 应用程序中,但不是从 ActiveRecord 继承的。
module JsonGenerator
def to_json
template = File.read("#{::Rails.root}/path/to/template.json.jbuilder")
Jbuilder.new { |json| eval template }.target!
end
end
class Converter::Album
include JsonGenerator
end
如果我不使用任何部分,这是可行的。但是当我这样做时,使用这样的语法:
json.artists artists do |artist|
json.partial! 'artist', artist: artist
end
我收到此错误:
Failure/Error: eval template
TypeError:
{:artist=>#<Converter::Artist:0x00007fd0d1a99dc8 @name="Bob">} is not a symbol nor a string
问题似乎是 Jbuilder partials 不能接受 PORO 作为参数?
无论如何我都不想使用eval,但这是我找到的加载不在views 文件夹中的模板的唯一方法。
如果我将所有模板直接复制粘贴为Jbuilder.new 方法的参数,我会得到同样的错误。
2019 年 4 月 12 日更新
我试过这条线
json.partial! partial: 'artist', locals: { artist: artist }
即使它加载了部分,它生成的数据也是错误的。
我明白了
"artists" => [{"partial!"=>{"locals"=>{"name"=>"Bob", "instrument"=>"piano"}, "partial"=>"artist"}}]
而不是
"artists" => [{"name"=>"Bob", "instrument"=>"piano"}]
【问题讨论】:
标签: ruby-on-rails json rails-api ruby-on-rails-6 jbuilder