2012-01-20 8 views
18

私はRABLを使ってレンダリングしたいルビーハッシュを持っています。私はいくつかのRABLコードでこれをレンダリングしようとしているRABLを使った単純なRubyハッシュのレンダリング

@my_hash = { 
    :c => { 
     :d => "e" 
    } 
} 

object @my_hash => :some_object 
attributes :d 
node(:c) { |n| n[:d] } 

が、私は私がこれをレンダリングすることができますどのように{"c":null}

を受けていたハッシュは、次のようになりますRABL?

答えて

22

現在RABLはハッシュで、あまりにもうまく再生されません。私はハッシュをOpenStruct形式(よりRABLに優しいドット表記を使用する)に変換することでこれを回避することができました。あなたの例を使用する:

your_controller.rb

require 'ostruct' 
@my_hash = OpenStruct.new 
@my_hash.d = 'e' 

your_view.rabl

object false 
child @my_hash => :c do 
    attributes :d 
end 

結果

{ 
    "c":{ 
    "d":"e" 
    } 
} 
+0

ハッシュをOpenStructでラップする場合は、ドット表記法を使用する必要はありません。 https://github.com/nesquena/rabl/wiki/Rendering-hash-objects-in-rabl – jmosesman

2

このようなノードを指定すると、@my_hashオブジェクトへのアクセス権が与えられます。このオブジェクトにアクセスできます。だから、僕は少しもするようにコードを変更します

c_nodeは基本的に @my_hashオブジェクトです
object @my_hash 
node(:c) do |c_node| 
    {:d => c_node.d} 
end 

。これは、あなたが(JSONにここに示されている)期待している何を与える必要があります:

{ 
    "my_hash":{ 
     "c":{ 
     "d":"e" 
     } 
    } 
} 
+1

は、残念ながら、私はこのエラーの '未定義のメソッド 'd' を取得します。 – SundayMonday

+0

'.d'は' @ my_hash'の有効な属性ですか?そうでなければ、あなたがしようとしていることは不可能です。私はこのコードを自分でテストしましたが、オブジェクトの有効な属性のために働いていました。 – iwasrobbed

2

http://www.rubyquiz.com/quiz81.html

require "ostruct" 

    class Object 
    def to_openstruct 
     self 
    end 
    end 

    class Array 
    def to_openstruct 
     map{ |el| el.to_openstruct } 
    end 
    end 

    class Hash 
    def to_openstruct 
     mapped = {} 
     each{ |key,value| mapped[key] = value.to_openstruct } 
     OpenStruct.new(mapped) 
    end 
    end 

初期化子で、おそらくこれを定義して、任意のハッシュだけ入れto_openstructため、そのオーバーを送信します。このサイトから適応

:私の答えは部分的に下に記載されているサイトに基づいています基本的にはjnunnが表示されているものを表示します。

4

RABLは実際にルビのハッシュと配列を属性として簡単にルートオブジェクトとしてレンダリングすることはできません。

@my_object = OpenStruct.new 
@my_object.data = {:c => {:d => 'e'}} 

次にあなたがこのRABLテンプレートを使用することができます:だから、例えば、あなたがルートオブジェクトのためのこのようなOpenStruct作成した場合

object @my_object 

attributes :data 

をそして、それはレンダリングされます:

{"data": {"c":{"d":"e"}} } 

また、:cをルートオブジェクトのプロパティにする場合は、 "node"を使用してそのノードを作成し、そのノード内でハッシュをレンダリングできます。

# -- rails controller or whatever -- 
@my_hash = {:c => {:d => :e}} 

# -- RABL file -- 
object @my_hash 
# Create a node with a block which receives @my_hash as an argument: 
node { |my_hash| 
    # The hash returned from this unnamed node will be merged into the parent, so we 
    # just return the hash we want to be represented in the root of the response. 
    # RABL will render anything inside this hash as JSON (nested hashes, arrays, etc) 
    # Note: we could also return a new hash of specific keys and values if we didn't 
    # want the whole hash 
    my_hash 
end 

# renders: 
{"c": {"d": "e"}} 

ちなみに、これはまさにちょうどレールでrender :json => @my_hashを使用するのと同じであるので、RABLはこの些細な場合に特に有用ではありません。)しかし、それはとにかく仕組みを示しています。

6

時にはあまりにも多くのイホを行うのは簡単です。

どの程度だけ

render json: my_hash 

そして、ちょうど魔法のように、我々はいくつかのコードを削除することができます!

29

これは任意のハッシュ値に対して機能します。

object false 

@values.keys.each do |key| 
    node(key){ @values[key] } 
end 

は、オブジェクトにRailsの3.2.13とRuby 2.0.0-P195に

+5

これははるかにエレガントな答えで、底に埋もれています。 'OpenStruct'を作成するよりもずっといいです! – agmin

5

RABLお得な情報を使用して私のために働いたが、特定のORMを必要としません。ドット表記をサポートするオブジェクトだけ。あなたはrablを使用したいとあなたが持っているすべては、ハッシュの場合:

@user = OpenStruct.new({ :name => "Bob", :age => 27, :year => 1976 }) 

、その後RABLテンプレート内:あなたが最初のドット表記法をサポートしているオブジェクトにハッシュを有効にする必要があり、その後

@user = { :name => "Bob", :age => 27, :year => 1976 } 

他のオブジェクトとしてOpenStructを扱う:

object @user 
attributes :name, :age, :year 

アプリであなたがやっているすべてはちょうどハッシュで扱っているし、何のオブジェクトまたはデータベース関与がない場合、あなたがたほうが良いことを考えてみましょうjson_builderやjbuilderなどのカスタムJSONビルダーを使用しています。 RABLのgithubの上の公式のwikiページから貼り付け

:上記のコードを使用している場合Symbol`:C:https://github.com/nesquena/rabl/wiki/Rendering-hash-objects-in-rabl

関連する問題