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

时间:2014-05-30 03:37:28

标签: ruby-on-rails json ruby-on-rails-4 rabl

我喜欢Rails控制器(所有这些,实际上,它是一个API)来永远呈现JSON。

我不希望Rails返回"路由未找到",或者尝试找不到HTML模板,或者返回406.我只是想让它自动并始终呈现JSON,例如:从RABL或JBuilder视图。

这可能吗?相关问题似乎都有上述缺点的答案。

6 个答案:

答案 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)

我有类似的问题,但是&#39; .js&#39;延期。为了解决我在视图中做了以下事情: <%= 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的根控制器中。