【问题标题】:Rails 4 - How to render JSON regardless of requested format?Rails 4 - 无论请求的格式如何,如何呈现 JSON?
【发布时间】:2014-05-30 03:37:28
【问题描述】:

我想要一个 Rails 控制器(实际上都是一个 API)来始终呈现 JSON。

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以在控制器中添加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)
    • FWIW,我刚刚在 Rails 5 中尝试了这个解决方案(使用 html 格式,vs json),Rails 不会采用 :html,它需要 'html' 作为字符串。不知道为什么它不接受request.format 的符号,但是一旦我将它从:html 更改为'html',它就工作得很好。
    • 在rails 5中我使用request.format = :json unless request.format.symbol
    • 或内联它:``` before_action { request.format = :json unless request.format } ``
    【解决方案2】:

    你可以使用format.any:

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

    【讨论】:

      【解决方案3】:

      只是:

      render formats: :json
      

      【讨论】:

      • @Akaisteph7 不太清楚你的意思。这个答案显然与其他答案不同。
      • 我的意思是你应该在你的答案中添加一些上下文。
      【解决方案4】:

      我遇到了类似的问题,但扩展名为“.js”。为了解决我在视图中做了以下操作: <%= params.except!(:format) %> <%= will_paginate @posts %>

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          当然:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-13
            相关资源
            最近更新 更多