Использование управления версиями в приложении Rails API. Не удается отобразить JSON для определенного действия контроллера.

Я создал практическое приложение rails, в котором я создал пространство имен и версию, как показано в этом рельсовая трансляция. Все работает нормально, и я вижу вывод json в браузере.

Затем я добавил гем Rabl и попытался отобразить представления rabl, но я получаю пустой массив JSON, отображаемый в браузере.

Вот что я систематически делал, чтобы управление версиями работало

1) changed the routes file to look like this

App0828::Application.routes.draw do

 namespace :api, defaults: { format: 'json'} do
   namespace :v1 do
    resources :vendors
   end
 end

  #resources :vendors
  #root to: 'vendors#index'
end

2) The created thise files
    app/copntrollers/api/v1/vendors_controller.rb

  Inside the vendors_controller.rb I added the following code

 module Api
  module V1
  class VendorsController < ApplicationController

  class Vendor < ::Vendor
    #subclass vendor class so thatyou can extend its behaviour just for this version
    #add any functions specific to this version here
    end

  respond_to :json

  def index
    respond_with Vendor.all       
  end

  def show
    respond_with Vendor.find(params[:id])
  end
  ..........

3) Then I pointed my browser to this url "http://localhost:3000/api/v1/vendors"
   And I can see the json output in my browser

4) Then I added the rabl gem
5) restarted the server
6) Changed the above file at    app/copntrollers/api/v1/vendors_controller.rb
   from the version above to the version below

  module Api
   module V1
   class VendorsController < ApplicationController

    class Vendor < ::Vendor
      #subclass vendor class so thatyou can extend its behaviour just for this version
      #add any functions specific to this version here
    end

    respond_to :json

  def index
    render 'api/v1/index.json.rabl'
   end

  def show
    render 'api/v1/show.json.rabl'
  end

  .......
 7) I created the following files with this code:
     file: app/views/api/v1/show.json.rabl
     code:    object @vendor
              attributes :id, :name

     file: app/views/api/v1/index.json.rabl
     code:   object @vendors
             attributes :id, :name
 8) Routes file looks like this

 api_v1_vendors GET    /api/v1/vendors(.:format)   api/v1/vendors#index {:format=>"json"}

 POST   /api/v1/vendors(.:format)          api/v1/vendors#create {:format=>"json"}

 new_api_v1_vendor GET    /api/v1/vendors/new(.:format)      api/v1/vendors#new {:format=>"json"}

 edit_api_v1_vendor GET    /api/v1/vendors/:id/edit(.:format) api/v1/vendors#edit {:format=>"json"}

 api_v1_vendor GET    /api/v1/vendors/:id(.:format)      api/v1/vendors#show {:format=>"json"}
 PUT    /api/v1/vendors/:id(.:format)      api/v1/vendors#update {:format=>"json"}

 DELETE /api/v1/vendors/:id(.:format)      api/v1/vendors#destroy {:format=>"json"}

 9) Finally I went to url: "http://localhost:3000/api/v1/vendors.json"

  And all I see in the browser is an empty JSON hash: "{}"

Так что ясно, что он не может получить доступ к переменным экземпляра. Кажется, какая-то проблема с выходом за рамки. Я не уверен, как действовать дальше. Я не смог найти в Интернете примеров управления версиями с помощью rabl. Какие-либо предложения? Я действительно ценю это

Спасибо


person banditKing    schedule 28.08.2012    source источник


Ответы (1)


Где вы устанавливаете переменные экземпляра?

Во-первых, у вас, вероятно, должна быть эта строка: respond_to :json в вашем Api::ApplicationController (или что-то в этом роде, в основном контроллер, от которого наследуются все остальные контроллеры в модуле Api).

Вам не нужны эти: render 'api/v1/index.json.rabl'.

Просто установите переменные экземпляра:

def index
    @vendors = Vendor.all
    respond_with @vendors
end

def show
    @vendor = Vendor.find(params[:id])
    respond_with @vendor
end
person Robin    schedule 28.08.2012
comment
Спасибо за Ваш ответ. Это сработало. Один короткий вопрос: что мне делать с файлами html.erb для моих контроллеров и контроллером приложений для представлений html? Должен ли я оставить его или удалить его. Поскольку это приложение только для API - person banditKing; 29.08.2012
comment
Если это только API, я не вижу причин держать их рядом :) - person Robin; 29.08.2012