Rails 4 -如何呈现JSON而不管请求的格式?

v7pvogib  于 2023-10-21  发布在  其他
关注(0)|答案(7)|浏览(106)

我想要一个Rails控制器(实际上,所有这些都是一个API)来始终呈现JSON。
我不希望Rails返回“route not found”,或者尝试找不到HTML模板,或者返回406。我只是希望它能自动并始终呈现JSON,例如。从RABL或JBuilder视图。
这可能吗?相关问题的答案似乎有上述的缺点。

2nc8po8w

2nc8po8w1#

您可以在控制器中添加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
eni9jsuy

eni9jsuy2#

可以使用format.any

def action
  respond_to do |format|
    format.any { render json: your_json, content_type: 'application/json' }
  end
end
bis0qfac

bis0qfac3#

只是

render formats: :json
epfja78i

epfja78i4#

我有类似的问题,但与'.js'扩展。为了解决这个问题,我在视图中执行了以下操作:<%= params.except!(:format) %> <%= will_paginate @posts %>

vptzau2j

vptzau2j5#

我尝试了上述解决方案,但它并没有解决我的用例。在我的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

cetgtptt

cetgtptt6#

我通常是这样做的,它工作。:json附近的lambda符号(=>)很重要。

def greet_action
  msg = {:greet => "hello"}
  render :json => msg
end
nhhxz33t

nhhxz33t7#

当然了:

before_filter :always_json

protected

def always_json
  params[:format] = "json"
end

您可能应该将其放在API的根控制器中。

相关问题