respond_with rails 4.2 中 backbone 的备选方案

respond_with alternatives in rails 4.2 for backbone

在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

有哪些替代方案?

只有 respond_with 和 class 级别 respond_to 已删除,如 here 所示。您仍然可以像往常一样使用实例级别 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。 Source

如果您正在寻找更强大的东西,请查看用于返回 JSON 结构(例如 jbuilder which is included with Rails 4.2 by default or rabl)的模板选项主机。希望这会有所帮助。

如果您遵循 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