默认渲染JSON而不是HTML?

48

我试图告诉Rails 3.2默认渲染JSON,并完全禁用HTML,代码如下:

respond_to :json    

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

使用这个语法,我必须在URL中添加.json。 我该如何实现?

4个回答

92
你可以修改你的routes.rb文件来指定默认格式。 routes.rb
resources :clients, defaults: {format: :json}

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


5
这个能否全局应用于所有资源? - shredding
5
要为所有资源添加默认格式,请在“defaults”块中声明资源:defaults format: 'json' {resources :clients; resources :products} - Tony - Currentuser.io
5
这个与较新版本的Rails兼容吗?我加了你提到的那行代码,但仍然只呈现HTML。请问您能否向我解释一下如何做呢?谢谢。 - rafalefighter
3
很好,你也可以将它应用到命名空间(和可能是作用域等)。例如 namespace :api, { defaults: { format: :json } } do 。我目前正在Rails 5上这样做。 - Ryan
谢谢@Ryan,这正是我正在寻找的。 - sameera207

16

如果您想要在Web和API上使用相同的控制器操作,那么这种模式非常适合。像往常一样制作Web版本,使用:html作为默认格式。然后将API放在一个路径下,并在那里设置:json为默认格式。

Rails.application.routes.draw do

  resources :products

  scope "/api", defaults: {format: :json} do
    resources :products
  end

end

11

如果您的索引操作不需要RESTful响应,则可以直接呈现您的XML响应:

def index
  render json: Client.all
end

1
@Tronic 或许我没有理解你的意思。我认为你的 index 操作根本不应该响应 html,而且你希望它即使在 URL 中没有 .json 也能响应 json。 - jdoe
这是一个有价值的替代方案,适用于那些不想覆盖其控制器的所有默认响应,而只想针对某个特定操作进行更改的人。 - Don Cheadle

1
扩展Mark Swardstrom的答案,如果你的Rails应用程序是一个始终返回JSON响应的API,你可以简单地执行以下操作:
Rails.application.routes.draw do
  scope '/', defaults: { format: :json } do
    resources :products
  end
end

1
这对Devise不起作用。您必须手动设置默认值:devise_for:users,defaults:{format::json} - Bibek Shrestha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接