【问题标题】:Force render format for all actions强制所有操作的渲染格式
【发布时间】:2013-11-07 10:29:06
【问题描述】:

我想用 json 响应所有格式。

我可以将渲染格式强制为json,因此尽管有accept 标头,操作仍将渲染show.json

  def show
    render formats: :json
  end

如何为控制器的所有操作设置渲染格式?

类似这样的:

class GalleriesController < ApplicationController
  formats :json
end

【问题讨论】:

  • 你试过respond_to do |format| format.html { render formats: :json } format.js { render formats: :json } end 吗?
  • 我不想为每个操作添加代码,所以似乎stackoverflow.com/a/6519357/1644531 是处理这个问题的唯一方法?
  • 如果您不将代码放入您的操作中,它们将在显示操作中呈现什么?
  • @phoet 默认情况下,所有操作都会以其名称呈现视图:\

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


【解决方案1】:

作为所有cmets对问题的总结和对未来用户的可读性,你可以这样做,如here所述:

before_filter :default_format_json

def default_format_json
  request.format = "json"
end

【讨论】:

  • 看起来不错。但是你确定这是正确的吗?我不想改变请求格式,我想改变response的格式。
  • 至少,它有效。由您决定是否采用此解决方案:)
【解决方案2】:

在您的控制器中:

def my_action
  formats.clear
  formats << :json
end

(我只在 Rails 4.2 和 3.2 中测试过。)

formats 返回格式符号数组。它被委托给@_lookup_context,它是ActionView::LookupContext 的一个实例。

【讨论】:

    【解决方案3】:

    覆盖响应内容类型。在此处阅读有关响应对象的更多信息:http://guides.rubyonrails.org/action_controller_overview.html#the-response-object

    before_filter :force_json
    
    def force_json
      response.content_type = Mime[:json]
    end
    

    使用 respond_to:

    def action
      respond_to do |format|
        format.any(:html, :js, :json) { render json: @object.to_json }
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 2014-07-27
      • 1970-01-01
      相关资源
      最近更新 更多