我正在尝试将此.json.rabl视图转换为.json.erb,因为我对ruby非常新,我正在寻找实现此目标的方向。最好的方法是什么?
object @perform
attributes :id => :team_id
attributes :perform_id
node(:fb_user_id) {|x| x.user.fb_user_id.to_s}
node(:first_name) {|x| x.user.first_name}
node(:last_name) {|x| x.user.last_name}
attributes :level, :jersey, :height, :weight, :positions
node(:stat_source) {|x| Stat::SOURCES.key(x.stat_source)}
if !@nomvps
node({}, :if => lambda{ |m| @event.present? }) do |x|
{
mvp_votes: Vote.player_vote_count(@event.id, x.id)
}
end
end
if !@nostats && (@_options[:event] || @event)
node :stats do |perform|
Hash[*perform.source_stats.where(event_id: (@_options[:event].try(:id) || @event.id)).map{|x|[x.name, x.value]}.flatten]
end
end
答案 0 :(得分:3)
Erb与像rabl这样的模板语言相反 - 你创建了你想要的json,然后用erb插入值,而不是用rabl中的代码定义结构。
在< %%>周围的文本中表示一些ruby代码(用于赋值,循环等):
<% x = "output" %>
和&lt;%=%&gt; (NB = sign)表示通过调用to_s:
将输出到模板的ruby代码(任何代码)<%= x.to_json %>
任何未被这些符号包围的内容都会完全按原样输出。
因此,您应该能够使用伪值创建所需的json,然后调用相关的ruby代码以在运行时获取实际值。例如类似于这个片段的东西(不熟悉rabl所以json的格式可能需要调整):
[{ "perform" :
{
"id" : <%= @perform.team_id %>,
"user" : <%= @perform.perform_id %>,
...
}
}]
<% if !@nomvps %>
<% node({}, :if => lambda{ |m| @event.present? }) do |x| %>
{
mvp_votes: <%= Vote.player_vote_count(@event.id, x.id) %>
}
<% end %>
<% end %>
对于以干净方式映射到json的对象,例如你也可以考虑创建to_json方法,而不是像这样在模板中放置它们,但对于像这样的复杂结构而没有干净的映射,模板可能是最好的。
我将从名为xx.json.erb(纯json)的文件中的json开始,然后使用erb开始插入值。
答案 1 :(得分:0)
也许这不是确切问题的答案,但是在rails中执行JSON视图的认可方式是使用jbuilder
。
JBuilder的API与RABL的API非常相似,但它由完全相同的rails核心团队完成,因此它与所有内部集成,如缓存助手(将来还有缓存依赖),部分等等。 / p>