是的,您可以在 RABL 模板中使用条件句。这种语法对我来说是正确的。它会给你带来什么麻烦吗?
请注意,由于您将 event.charge 与 true 进行比较,因此您可以省略比较,只需执行以下操作:
if (event.charge) {
collection @events
attributes :title, :date, :time, :venue, :description
}
[UPDATE] 以补充信息回应 cmets。
好的,这里有两个问题。
首先,您可能确实希望在 DB 级别使用范围来缩小 @events 的集合。从数据库中提取行并从中创建 ActiveRecord 对象是一项昂贵的操作,因此您不想为不打算使用的行/对象执行此操作。
第二个问题与 RABL 模板的结构有关。您的 gist (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 集合时,它在yields 到提供的块时传递当前事件,并且提供的块已将变量命名为它接收event。 (我知道这有点循环。我希望这是有道理的。)
为了说明条件,因为我已经提到过滤集合最好在控制器级别完成,假设您有一个要根据事件标题填充的属性。你可以这样做:
node(:is_special) do |event|
if event.title == 'Some Special Event'
'Aye, sir!'
else
'No way!'
end
end
我希望这一切都有意义。