2

我正在尝试将此 .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

4

2 回答 2

3

Erb 与 rabl 等模板语言相反——您创建所需的 json,然后使用 erb 插入值,而不是像在 rabl 中那样使用代码定义结构。

在带有 <% %> 的 erb 周围文本中表示一些 ruby​​ 代码(用于分配、循环等):

<% x = "output" %>

<%= %> (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 插入值。

于 2012-10-15T18:03:48.217 回答
0

也许这不是对确切问题的答案,但在 Rails 中执行 JSON 视图的认可方法是使用jbuilder.

JBuilder 的 API 与 RABL 非常相似,但它是由同一个 rails 核心团队完成的,因此它集成了所有内部组件,如缓存助手(未来还有缓存依赖)、部分等。

https://github.com/rails/jbuilder

于 2012-10-16T12:58:57.960 回答