如果param等于某个值,是否可能/这是RABL将对象呈现为JSON的正确语法?
if (event.charge == true) {
collection @events
attributes :title, :date, :time, :venue, :description
}
我有一个完整的对象页面,并希望RABL只在字段中的值正确时才将该对象渲染为JSON。
非常感谢!
答案 0 :(得分:0)
是的,您可以在RABL模板中使用条件。这种语法对我来说是正确的。它会给你带来某种麻烦吗?
请注意,由于您要将event.charge
与true
进行比较,因此您可以省略比较并执行此操作:
if (event.charge) {
collection @events
attributes :title, :date, :time, :venue, :description
}
[更新] 以回复包含其他信息的评论。
好的,这里有两个问题。
首先,您可能希望使用范围来缩小数据库级别的@events
集合。从数据库中提取行并从中创建ActiveRecord
对象是一项昂贵的操作,因此您不希望对不打算使用的行/对象执行此操作。
第二个问题与RABL模板的结构有关。您的要点(https://gist.github.com/DevanB/6709271)中列出的模板应该运行良好。
collection @events
attributes :title, :date, :time, :venue # ....
node(:imageUrl){|events| events.image.url(:main)}
node(:imageThumbUrl){|events| events.image.url(:thumb)}
这基本上告诉RABL迭代@events
并为每一个构建包含所列属性的JSON哈希,并在带有图像URL的哈希中构建额外的属性。 (我想你已经知道了这一点,只是想明确一点。)
当您尝试使用if event.charge
包装整个模板时遇到了麻烦,因为此时没有名为event
的变量。对event
块的引用在node
块内部起作用,因为当RABL循环通过@events
集合时,它会在当前事件中传递yield
到提供的块,并且提供的块已命名它接收的变量event
。 (我知道这有点圆。我希望它有意义。)
为了说明条件,我已经提到过滤集合最好在控制器级别完成,让我们假设您有一个要根据事件标题填充的属性。你可以这样做:
node(:is_special) do |event|
if event.title == 'Some Special Event'
'Aye, sir!'
else
'No way!'
end
end
我希望这一切都有道理。