0

如果参数等于某个值,是否有可能/这是 RABL 将对象呈现为 JSON 的正确语法?

if (event.charge == true) {
  collection @events
  attributes :title, :date, :time, :venue, :description
}

我有一个充满对象的页面,并且希望 RABL 仅在字段中的值正确时将该对象呈现为 JSON。

谢谢!

4

1 回答 1

0

是的,您可以在 RABL 模板中使用条件。这种语法对我来说是正确的。它会给你带来某种麻烦吗?

请注意,由于您正在比较event.chargetrue因此您可以省略比较并执行以下操作:

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

我希望这一切都有意义。

于 2013-09-26T02:02:08.937 回答