【问题标题】:RABL render JSON object if statementRABL 渲染 JSON 对象 if 语句
【发布时间】:2013-09-26 01:42:54
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 我不确定 RABL 模板是不是最好的地方。您不能将控制器中的 @events 集合限定为仅包含您要显示的记录吗?

标签: ruby-on-rails json rabl


【解决方案1】:

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

请注意,由于您将 event.chargetrue 进行比较,因此您可以省略比较,只需执行以下操作:

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

我希望这一切都有意义。

【讨论】:

  • charge 列是一个布尔值,默认为 0。我想渲染那个事件是 charge 是 1。我试过你的语法,我试过 event.charge == 1, event.charge = = "1", event.charge == "true" 和 event.charge == true 不幸的是,这些都不起作用。它仍在渲染每个事件。
  • 显示更多的 RABL 模板可能会有所帮助。目前还不清楚你想在那里做什么。您的问题的简短回答是在 RABL 模板中使用 if 是可能的。除此之外,您似乎正在尝试做一些不标准的事情。您是否有机会发布设置模板和您尝试使用的整个模板的控制器操作?
  • 也许这会有所启发。 gist.github.com/DevanB/6709271 有一个费用字段,如果用户为某些东西付费,我将该布尔值从 0 更改为 1。我可以设置一个范围。那只会呈现符合该范围的事件吗?就像我在索引操作中做了@events = Event.upcoming.paid.all
  • 好的,很好,这个要点很有帮助。我刚刚在原始答案中添加了 [UPDATE]。
  • 这对我来说很有意义!感谢杰里米的帮助! :) (如果您还没有弄清楚,我对 Rails 有点陌生,所以这很有帮助!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2020-06-26
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多