5

在 rails 4.2 中respond_withrespond_to已移至respondersgem。我读过这不是最佳做法。我backbone.js用于我的应用程序。

为了渲染控制器中的所有用户,我使用:

class UsersController < ApplicationController
  respond_to :json

  def index
    @users = User.all

    respond_with @users
  end
end

有哪些替代方案?

4

2 回答 2

10

它只是respond_with和类级别respond_to已被删除,如此处所示。您仍然可以respond_to像往常一样使用实例级别

class UsersController < ApplicationController
  def index
    @users = User.all

    respond_to do |wants|
      wants.json { render json: @users }
    end
  end
end

话虽这么说,将响应者 gem 添加到您的项目中并继续像您的示例中那样编写代码绝对没有错。将这种行为提取到单独的 gem 中的原因是许多 Rails 核心成员认为它不属于主要的 Rails API。来源

如果您正在寻找更强大的东西,请查看用于返回 JSON 结构的大量模板选项,例如Rails 4.2 默认包含的jbuilder或rabl。希望这可以帮助。

于 2015-02-10T03:15:52.797 回答
2

如果您遵循 Bart Jedrocha 的建议并使用 jbuilder(它是默认添加的),那么这两个respond_*方法调用都变得不必要了。这是我为测试 Android 应用程序而制作的一个简单 API。

# controllers/api/posts_controller.rb

module Api
  class PostsController < ApplicationController

    protect_from_forgery with: :null_session

    def index
      @posts = Post.where(query_params)
                            .page(page_params[:page])
                            .per(page_params[:page_size])
    end

    private

    def page_params
      params.permit(:page, :page_size)
    end

    def query_params
      params.permit(:post_id, :title, :image_url)
    end

  end
end

# routes.rb

namespace :api , defaults: { format: :json } do
  resources :posts
end

# views/api/posts/index.json.jbuilder

json.array!(@posts) do |post|
  json.id        post.id
  json.title     post.title
  json.image_url post.image_url
end
于 2015-03-07T03:23:41.040 回答