如果参数等于某个值,是否有可能/这是 RABL 将对象呈现为 JSON 的正确语法?
if (event.charge == true) {
collection @events
attributes :title, :date, :time, :venue, :description
}
我有一个充满对象的页面,并且希望 RABL 仅在字段中的值正确时将该对象呈现为 JSON。
谢谢!
如果参数等于某个值,是否有可能/这是 RABL 将对象呈现为 JSON 的正确语法?
if (event.charge == true) {
collection @events
attributes :title, :date, :time, :venue, :description
}
我有一个充满对象的页面,并且希望 RABL 仅在字段中的值正确时将该对象呈现为 JSON。
谢谢!
是的,您可以在 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
我希望这一切都有意义。