2015-02-10 7 views
2

В рельсах 4.2 respond_with и respond_to были перемещены в драгоценный камень responders. Я читал, что это не лучшая практика. Я использую backbone.js для своего приложения.response_with альтернативы в рельсах 4.2 для магистрали

Для отображения всех пользователей в контроллере я использую:

class UsersController < ApplicationController 
    respond_to :json 

    def index 
    @users = User.all 

    respond_with @users 
    end 
end 

Каковы альтернативы?

ответ

7

Это только respond_with и уровень класса 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 

Это, как говорится, нет абсолютно ничего плохого с добавлением ответчики камень в свой проект и продолжая писать код, как в вашем примере. Причина извлечения этого поведения в отдельный драгоценный камень заключается в том, что многие члены Rails не чувствовали, что он принадлежит основному Rails API. Source.

Если вы ищете что-то более надежное, взгляните на хост шаблонов для возврата структур JSON, таких как jbuilder, который включен в Rails 4.2 по умолчанию или rabl. Надеюсь это поможет.

2

Если вы следуете предложению Барта Джедроха и используете jbuilder (он добавлен по умолчанию), то вызовы метода respond_* становятся ненужными. Вот простой API, который я сделал для тестирования приложения для Android.

# 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 
Смежные вопросы