使用RABL渲染简单的Ruby哈希

Sun*_*day 19 ruby rendering rabl

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

@my_hash = {
    :c => {
        :d => "e"
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图用一些RABL代码渲染它:

object @my_hash => :some_object
attributes :d
node(:c) { |n| n[:d] }
Run Code Online (Sandbox Code Playgroud)

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

如何使用RABL渲染?

rha*_*iso 31

这适用于任意哈希值.

object false

@values.keys.each do |key|
  node(key){ @values[key] }
end
Run Code Online (Sandbox Code Playgroud)

使用Rails 3.2.13和Ruby 2.0.0-p195为我工作

  • 这是迄今为止最优雅的答案,埋藏在底部.比强迫你创建一个`OpenStruct`好多了! (6认同)

jbn*_*unn 22

目前RABL与哈希的表现并不太好.我能够通过将我的哈希值转换为OpenStruct格式(使用更多RABL友好的点符号)来解决这个问题.使用你的例子:

your_controller.rb

require 'ostruct'
@my_hash = OpenStruct.new
@my_hash.d = 'e'
Run Code Online (Sandbox Code Playgroud)

your_view.rabl

object false
child @my_hash => :c do
    attributes :d
end
Run Code Online (Sandbox Code Playgroud)

结果

{
  "c":{
    "d":"e"
  }
}
Run Code Online (Sandbox Code Playgroud)


Len*_*enW 6

有时它容易做太多imho.

怎么样

render json: my_hash
Run Code Online (Sandbox Code Playgroud)

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


bar*_*olo 5

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

@user = { :name => "Bob", :age => 27, :year => 1976 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

object @user
attributes :name, :age, :year
Run Code Online (Sandbox Code Playgroud)

考虑一下,如果您在应用程序中执行的所有操作只是处理哈希并且没有涉及对象或数据库,那么使用其他更多自定义JSON构建器(如json_builder或jbuilder)可能会更好.

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