我喜欢Rails控制器(所有这些,实际上,它是一个API)来永远呈现JSON。
我不希望Rails返回"路由未找到",或者尝试找不到HTML模板,或者返回406.我只是想让它自动并始终呈现JSON,例如:从RABL或JBuilder视图。
这可能吗?相关问题似乎都有上述缺点的答案。
答案 0 :(得分:31)
您可以在控制器中添加before_filter
,将请求格式设置为json
:
# app/controllers/foos_controller.rb
before_action :set_default_response_format
protected
def set_default_response_format
request.format = :json
end
这会将所有响应格式设置为json
。如果您想允许其他格式,则可以在设置format
时检查是否存在request.format
参数,例如:
def set_default_response_format
request.format = :json unless params[:format]
end
答案 1 :(得分:11)
您可以使用format.any
:
def action
respond_to do |format|
format.any { render json: your_json, content_type: 'application/json' }
end
end
答案 2 :(得分:1)
只是:
render formats: :json
答案 3 :(得分:0)
我有类似的问题,但是' .js'延期。为了解决我在视图中做了以下事情:
<%= params.except!(:format) %>
<%= will_paginate @posts %>
答案 4 :(得分:0)
我尝试了上述解决方案,但没有解决我的用例。
在我的Rails 4.2应用程序的某些控制器中,没有显式调用render
。例如,调用了服务对象,但未返回任何内容。由于它们是json api控制器,因此Rails抱怨缺少模板错误。为了解决这个问题,我将其添加到我们的基本控制器中。
def render(*args)
options = args.first
options.present? ? super : super(json: {}, status: :ok)
end
这是我要转换为Rails 5的大型应用程序,因此,这是一项安全措施,因为我删除了似乎自动执行此操作的RocketPants
gem。
请注意,我的控制器继承自ActionController::Base
答案 5 :(得分:-1)
当然:
before_filter :always_json
protected
def always_json
params[:format] = "json"
end
您应该将其放在API的根控制器中。