20

RABLを使用してレンダリングしたいルビー ハッシュがあります。ハッシュは次のようになります。

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

これをいくつかのRABLコードでレンダリングしようとしています:

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

しかし、私は受け取っています{"c":null}

これを RABL でレンダリングするにはどうすればよいですか?

4

7 に答える 7

31

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

object false

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

Rails 3.2.13 と Ruby 2.0.0-p195 を使用して私のために働いた

于 2013-06-28T16:44:33.110 に答える
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"
  }
}
于 2012-03-22T15:04:27.577 に答える
6

時々、あまりにも多くのimhoを行うのは簡単です。

ただどうですか

render json: my_hash

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

于 2013-03-06T21:49:42.640 に答える
4

RABL は実際には、ルート オブジェクトとしてではなく、属性として Ruby ハッシュと配列を簡単にレンダリングできます。したがって、たとえば、ルート オブジェクトに対して次のような OpenStruct を作成するとします。

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

次に、この RABL テンプレートを使用できます。

object @my_object

attributes :data

そして、それは次のようになります:

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

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

# -- 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"}}

ちなみに、これは単に Rails で使用するのとまったく同じrender :json => @my_hashなので、RABL はこの些細なケースでは特に役に立ちません ;) しかし、とにかく仕組みを示しています。

于 2013-02-04T17:32:07.140 に答える
2

そのようなノードを指定することにより、@my_hash属性にアクセスできるオブジェクトへのアクセスが与えられます。したがって、コードを次のように少し変更します。

object @my_hash
node(:c) do |c_node|
  {:d => c_node.d}
end

c_node本質的に@my_hashオブジェクトはどこにありますか。これにより、期待どおりの結果が得られるはずです (ここでは JSON で表示されます)。

{
   "my_hash":{
      "c":{
         "d":"e"
      }
   }
}
于 2012-01-20T06:41:12.943 に答える
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 を配置し、それを rabl テンプレートに送信して、基本的に jnunn がビューに表示することを実行します。

于 2012-09-21T00:52:17.450 に答える