如何更改空Jbuilder部分的默认行为?

时间:2017-07-24 12:34:46

标签: ruby-on-rails json ruby partials jbuilder

模型关系:Article belongs_to Author

示例jbuilder视图:

json.extract! article,
  :id,
  :created_at,
  :updated_at
json.author article.author, partial: 'author', as: :author

当文章没有作者时会发生什么:

{
   "id": 1,
   "created_at": "01-01-1970",
   "updated_at": "01-01-1970",
   "author": []
}

问题:

当传递给关联模板的变量为空时,是否有一种干净的方法可以强制jbuilder显示null{}?这个问题在相当大的应用程序中很普遍,并且在任何地方添加像article.author.empty? ? json.author(nil) : json.author(article.author, partial: 'author', as: :author)这样的代码并不是我想做的事情。也许某种形式的助手不需要太多的重构?

我不想覆盖核心jbuilder功能,因为我不想破坏它(例如,partials接受多个变量)。

相关的jbuilder问题:https://github.com/rails/jbuilder/issues/350

1 个答案:

答案 0 :(得分:1)

这将实现您想要的目标

json.author do
  if article.author.blank?
    json.null!
  else
    json.partial! 'authors/author', author: article.author
  end
end

我会建议帮助者避免所有重复:

module ApplicationHelper
  def json_partial_or_null(json, name:, local:, object:, partial:)
    json.set! name do
      object.blank? ? json.null! : json.partial!(partial, local => object)
    end
  end
end

然后你会这样称呼:

json_partial_or_null(json, name: 'author', local: :author, object: article.author, partial: 'authors/author')