我有一个 ruby 哈希,我想使用RABL渲染。哈希看起来像这样:
@my_hash = {
:c => {
:d => "e"
}
}
我正在尝试使用一些 RABL 代码来呈现它:
object @my_hash => :some_object
attributes :d
node(:c) { |n| n[:d] }
但我收到{"c":null}
如何用 RABL 渲染它?
这适用于任意哈希值。
object false
@values.keys.each do |key|
node(key){ @values[key] }
end
使用 Rails 3.2.13 和 Ruby 2.0.0-p195 为我工作
目前 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"
}
}
有时很容易做太多恕我直言。
刚刚怎么样
render json: my_hash
就像魔术一样,我们可以删除一些代码!
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 上的官方 wiki 页面粘贴:https ://github.com/nesquena/rabl/wiki/Rendering-hash-objects-in-rabl
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 在这种微不足道的情况下并不是特别有用;)但无论如何它都演示了机制。
通过指定这样的节点,您可以访问@my_hash
对象,然后您可以访问其属性。因此,我只需将您的代码稍微更改为:
object @my_hash
node(:c) do |c_node|
{:d => c_node.d}
end
wherec_node
本质上是@my_hash
对象。这应该会给您您所期望的(此处以 JSON 格式显示):
{
"my_hash":{
"c":{
"d":"e"
}
}
}
我的回答部分基于以下列出的网站:
改编自本网站:
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 在视图中显示的操作。