使用RABL渲染简单的Ruby哈希

时间:2012-01-20 03:17:33

标签: ruby rendering rabl

我有一个ruby哈希,我想用RABL渲染。哈希看起来像这样:

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

我正在尝试使用一些RABL代码来渲染它:

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

但我收到了{"c":null}

如何使用RABL呈现此内容?

7 个答案:

答案 0 :(得分:30)

这适用于任意哈希值。

object false

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

使用Rails 3.2.13和Ruby 2.0.0-p195

为我工作

答案 1 :(得分: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"
  }
}

答案 2 :(得分:6)

有时候很容易做太多的事情。

如何

render json: my_hash

就像魔术一样,我们可以删除一些代码!

答案 3 :(得分:5)

RABL处理对象但不需要特定的ORM。只是支持点表示法的对象。如果你想使用rabl,你所拥有的只是哈希:

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

然后你需要先将哈希转换为支持点表示法的对象:

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

然后在RABL模板中将OpenStruct视为任何其他对象:

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

考虑一下,如果你在应用程序中所做的一切只是处理哈希并且没有涉及对象或数据库,那么使用另一个更自定义的JSON构建器(如json_builder或jbuilder)可能会更好。

粘贴在RABL的github官方维基页面上:https://github.com/nesquena/rabl/wiki/Rendering-hash-objects-in-rabl

答案 4 :(得分: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成为根对象的属性,则可以使用“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"}}

顺便提一下,这与在rails中使用render :json => @my_hash完全相同,因此RABL在这个简单的情况下并不特别有用;)但它无论如何都展示了机制。

答案 5 :(得分: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"
      }
   }
}

答案 6 :(得分: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在视图中显示的内容。