【发布时间】:2014-05-30 03:37:28
【问题描述】:
我想要一个 Rails 控制器(实际上都是一个 API)来始终呈现 JSON。
我不希望 Rails 返回“找不到路由”,或者尝试找不到 HTML 模板,或者返回 406。我只希望它自动并始终呈现 JSON,例如从 RABL 或 JBuilder 视图。
这可能吗?相关问题的答案似乎具有上述缺点。
【问题讨论】:
标签: ruby-on-rails json ruby-on-rails-4 rabl
我想要一个 Rails 控制器(实际上都是一个 API)来始终呈现 JSON。
我不希望 Rails 返回“找不到路由”,或者尝试找不到 HTML 模板,或者返回 406。我只希望它自动并始终呈现 JSON,例如从 RABL 或 JBuilder 视图。
这可能吗?相关问题的答案似乎具有上述缺点。
【问题讨论】:
标签: ruby-on-rails json ruby-on-rails-4 rabl
您可以在控制器中添加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。如果你想允许其他格式,你可以在设置request.format时检查format参数的存在,例如:
def set_default_response_format
request.format = :json unless params[:format]
end
【讨论】:
/app/controllers/application_controller.rb 中以产生应用程序范围的效果(严格来说,如果您的应用程序是 API)
:html,它需要 'html' 作为字符串。不知道为什么它不接受request.format 的符号,但是一旦我将它从:html 更改为'html',它就工作得很好。
request.format = :json unless request.format.symbol
你可以使用format.any:
def action
respond_to do |format|
format.any { render json: your_json, content_type: 'application/json' }
end
end
【讨论】:
只是:
render formats: :json
【讨论】:
我遇到了类似的问题,但扩展名为“.js”。为了解决我在视图中做了以下操作:
<%= params.except!(:format) %>
<%= will_paginate @posts %>
【讨论】:
我尝试了上述解决方案,但没有解决我的用例。
在我的 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
【讨论】:
当然:
before_filter :always_json
protected
def always_json
params[:format] = "json"
end
您可能应该将它放在您的 API 的根控制器中。
【讨论】: