我使用jbuilder创建API的视图,但许多方法共享相同的jbuilder文件:
module API
module V1
class DevicesController < ActionController::Base
respond_to :json
def create
...
respond_with @device, status: 201
end
def update
...
respond_with @device, status: 200
end
end
end
在下面的示例中,create
和update
方法共享相同的视图: device_response.json.jbuilder 。我尝试在template "devices/device_response"
之后添加respond_to :json
,但我得到以下内容:
undefined method `template' for API::V1::DevicesController:Class
如何为两种方法定义唯一的jbuilder模板响应?
感谢。
答案 0 :(得分:4)
respond_with
不会将template
作为参数。要渲染相同的模板,您可以使用示例:
def create
# ......
respond_with(@device, status: 200) do |format|
if @device.save
format.json { redirect_to @device }
else
format.json { render 'devices/device_response' }
end
end
end
为什么有效respond_with(*resources, &block)
:
如果未标识可接受的格式,则应用程序返回a '406 - 不可接受'的状态。否则,默认响应是 呈现以当前操作和所选操作命名的模板 格式,例如index.html.erb。如果没有可用的模板,则为行为 取决于所选格式:
用于html响应 - 如果获取请求方法,则会出现异常 提出但是对于其他请求,例如发布回复取决于 资源是否有任何验证错误(即假设一个 已经尝试保存资源,例如,通过创建动作)
如果没有错误,即资源已成功保存,响应重定向到资源即显示操作。
如果存在验证错误,响应将呈现默认操作,即:对于发布请求为new或:为patch或put进行编辑。