我想要一个Rails控制器(实际上,所有这些都是一个API)来始终呈现JSON。我不希望Rails返回“route not found”,或者尝试找不到HTML模板,或者返回406。我只是希望它能自动并始终呈现JSON,例如。从RABL或JBuilder视图。这可能吗?相关问题的答案似乎有上述的缺点。
2nc8po8w1#
您可以在控制器中添加before_filter,将请求格式设置为json:
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参数的存在,例如:
request.format
format
def set_default_response_format request.format = :json unless params[:format] end
eni9jsuy2#
可以使用format.any:
format.any
def action respond_to do |format| format.any { render json: your_json, content_type: 'application/json' } end end
bis0qfac3#
只是
render formats: :json
epfja78i4#
我有类似的问题,但与'.js'扩展。为了解决这个问题,我在视图中执行了以下操作:<%= params.except!(:format) %> <%= will_paginate @posts %>
<%= params.except!(:format) %> <%= will_paginate @posts %>
vptzau2j5#
我尝试了上述解决方案,但它并没有解决我的用例。在我的Rails 4.2应用程序的一些控制器中,没有显式调用render。例如,调用了一个服务对象,但没有返回任何内容。由于它们是json API控制器,rails抱怨缺少模板错误。为了解决这个问题,我把它添加到我们的基本控制器。
render
def render(*args) options = args.first options.present? ? super : super(json: {}, status: :ok) end
这是一个我正在转换到Rails 5的大型应用程序,所以这只是一个安全措施,因为我删除了似乎会自动执行此操作的RocketPants gem。注意,我的控制器继承自ActionController::Base
RocketPants
ActionController::Base
cetgtptt6#
我通常是这样做的,它工作。:json附近的lambda符号(=>)很重要。
def greet_action msg = {:greet => "hello"} render :json => msg end
nhhxz33t7#
当然了:
before_filter :always_json protected def always_json params[:format] = "json" end
您可能应该将其放在API的根控制器中。
7条答案
按热度按时间2nc8po8w1#
您可以在控制器中添加
before_filter
,将请求格式设置为json
:这会将所有响应格式设置为
json
。如果你想允许其他格式,你可以在设置request.format
时检查format
参数的存在,例如:eni9jsuy2#
可以使用
format.any
:bis0qfac3#
只是
epfja78i4#
我有类似的问题,但与'.js'扩展。为了解决这个问题,我在视图中执行了以下操作:
<%= params.except!(:format) %> <%= will_paginate @posts %>
vptzau2j5#
我尝试了上述解决方案,但它并没有解决我的用例。在我的Rails 4.2应用程序的一些控制器中,没有显式调用
render
。例如,调用了一个服务对象,但没有返回任何内容。由于它们是json API控制器,rails抱怨缺少模板错误。为了解决这个问题,我把它添加到我们的基本控制器。这是一个我正在转换到Rails 5的大型应用程序,所以这只是一个安全措施,因为我删除了似乎会自动执行此操作的
RocketPants
gem。注意,我的控制器继承自
ActionController::Base
cetgtptt6#
我通常是这样做的,它工作。:json附近的lambda符号(=>)很重要。
nhhxz33t7#
当然了:
您可能应该将其放在API的根控制器中。