将Rabl转换为Erb json视图

时间:2012-10-05 12:34:46

标签: ruby-on-rails erb rabl

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

2 个答案:

答案 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>

https://github.com/rails/jbuilder