RABL呈现JSON对象if语句

时间:2013-09-26 01:42:54

标签: ruby-on-rails json rabl

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

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

我有一个完整的对象页面,并希望RABL只在字段中的值正确时才将该对象渲染为JSON。

非常感谢!

1 个答案:

答案 0 :(得分: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

我希望这一切都有道理。