2

私はこの .json.rabl ビューを .json.erb に変換しようとしていますが、ルビーが初めてなので、これを達成するための方向性を探しています。これについて最善の方法は何ですか?

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 のようなテンプレート言語の逆です。rabl のようにコードで構造を定義するのではなく、必要な json を作成し、erb で値を挿入します。

<% %> で囲まれた erb のテキストは、いくつかのルビ コード (割り当て、ループなど) を示します。

<% x = "output" %>

<%= %> (NB = 記号) は、to_s を呼び出すことによってテンプレートに出力されるルビ コード (任意のコード) を示します。

<%= 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 に答える