ruby-on-rails - 带有 Jbuilder(或其他)的 Rails JSON API 布局

标签 ruby-on-rails json layout jbuilder

在我的 rails 3.2 应用程序中,我使用的是 jbuilder呈现来自我的 JSON api 的响应。

我想为所有 API 响应提供一个通用结构,并且布局可能是保持我的 View DRY 的可能解决方案。

例如:我希望每个回复都采用以下形式:

{
  status: "ok|error|redirect",
  data:   { ... JSON specific to the current view ... },
  errors: [ ... ],
  notes:  [ ... ]
}

(其中 数据 的值是 View 提供的 json 结构,其他一切都来自布局)

但是:我无法让 jbuilder 布局正确地屈服于 View 。
# in layout 
json.data yield

# in view
json.some "value"

结果是:
{"data":"{\"some\":\"value\"}"}  # arg! my json has become a string

以另一种方式尝试:
# in layout 
yield

# in view
json.data do |json|
  json.some "value"
end

结果是 :
{}

有没有人使用 jbuilder 或其他 json 模板 gem/method 成功做到这一点?

juilder github issue表明这是可能的,但表明其他人也有类似的问题。

我看到 rabl (https://github.com/nesquena/rabl/) 应该支持布局 (https://github.com/nesquena/rabl/wiki/Using-Layouts),但我决定不使用它出于其他原因(rabl 使复杂的 json 结构成为一场噩梦,尤其是在尝试控制对象根等时)。

最佳答案

你可以通过这种方式做到这一点

# api.v1.json.jbuilder - layout
json.request do
  json.message "your message"
  json.status 200
end
json.data JSON.parse(yield)

# show.json.jbuilder - action view
json.name 'Some item name'

关于ruby-on-rails - 带有 Jbuilder(或其他)的 Rails JSON API 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11516616/

相关文章:

android - 关于这个 UI 实现的建议?

android - 如何让一个TextView占据中间所有的空闲空间?

ruby-on-rails - Rails 3 选择下拉框

ruby-on-rails - 在初始化程序中获取 rake 任务名称

ruby-on-rails - Docker Compose for Rails

json - JAX-RS 响应为字符串生成转义 JSON

java - 如何根据容器的宽度动态设置组件扩展属性

ruby-on-rails - 通过终端销毁特定用户 - ROR & Heroku

java - JSON Jersey JAXB

javascript - 从 JSON 数据填充复选框