【问题标题】:Render JSON instead of HTML as default?默认呈现 JSON 而不是 HTML?
【发布时间】:2012-05-27 18:01:09
【问题描述】:

我试图告诉 rails 3.2 它应该默认呈现 JSON,并完全像这样踢 HTML:

respond_to :json    

def index
  @clients = Client.all
  respond_with @clients
end

使用这种语法,我必须将.json 添加到 URL。我怎样才能实现它?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rendering


    【解决方案1】:

    您可以修改您的routes.rb 文件以指定默认格式

    routes.rb

    resources :clients, defaults: {format: :json}
    

    这将修改整个 clients_controller 的默认响应格式

    【讨论】:

    • 这个可以全局添加到所有资源吗?
    • 要为所有资源添加默认格式,请在 defaults 块中声明资源:defaults format: 'json' {resources :clients; resources :products}
    • 这与较新的 Rails 版本兼容吗?我添加了您提到的行,但它仍然呈现 HTML。先生,您能解释一下我该怎么做吗?谢谢
    • 这很棒,你也可以将它应用到命名空间(可能还有作用域等)。例如namespace :api, { defaults: { format: :json } } do。我目前在 Rails 5 上这样做
    • 感谢@Ryan,这正是我想要的 ?
    【解决方案2】:

    如果您想对两者使用相同的控制器操作,这种模式很有效。像往常一样制作网页版本,使用 :html 作为默认格式。然后,将 api 放在一个路径下,并将 :json 设置为那里的默认值。

    Rails.application.routes.draw do
    
      resources :products
    
      scope "/api", defaults: {format: :json} do
        resources :products
      end
    
    end
    

    【讨论】:

      【解决方案3】:

      如果您在索引操作中不需要 RESTful 响应,则只需直接呈现您的 xml 响应:

      def index
        render json: Client.all
      end
      

      【讨论】:

      • @Tronic 也许我没有正确理解你。我认为您的操作 index 根本不应该响应 html,并且您希望它响应 json,即使您的 url 中没有 .json。
      • 对于那些不想覆盖其所有控制器的默认响应但仅用于特定操作的人来说,这是一个有价值的替代 @rogeilog 的答案
      【解决方案4】:

      扩展 Mark Swardstrom 的回答,如果您的 rails 应用程序是一个始终返回 JSON 响应的 API,您可以简单地这样做

      Rails.application.routes.draw do
        scope '/', defaults: { format: :json } do
          resources :products
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-06
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 2018-02-08
        • 1970-01-01
        • 2019-06-27
        • 2021-09-01
        相关资源
        最近更新 更多