2013-02-13 16 views
14

In tutti gli esempi, le persone implementano solo un file api.rb gigante. Es:Come dividere le cose in un'app api d'uva?

Anche se questo approccio funziona bene come è, si può rapidamente diventare affollato e difficile da mantenere così vorrei dividere le cose sul mio app.

Per esempio, vorrei dividere le mie entità dalle mie risorse e quindi suddividere le mie risorse tra diversi file. Per alcuni esempi:

app 
- api 
    api.rb 
    - entities 
    - weblog.rb 
    - post.rb 
    - comment.rb 
    - resources 
    - weblog.rb 
    - post.rb 
    - comment.rb 

Ora, api.rb sarebbe qualcosa di simile:

require 'grape' 
module Blog 
    class API < Grape::API 
    prefix "api" 
    end 
end 

app/api/enti/post.rb sarebbe qualcosa di simile:

module Blog 
    module Entities 
    class Post < Grape::Entity 
     root 'posts', 'posts' 
     expose :id 
     expose :content 
    end 
    end 
end 

app/api/resources/post.rb sarebbe qualcosa di simile:

module Blog 
    class API < Grape::API 
    resource :posts do 
     get do 
     present Post.all, with: Blog::Entities::Post 
     end 

     desc "returns the payment method corresponding to a certain id" 
     params do 
     requires :id, :type => Integer, :desc => "Post id." 
     end 
     get ':id' do 
     present Post.find(params[:id]), with: Blog::Entities::Post 
     end 
    end 
    end 
end 

Quando facciamo questo, incontriamo il seguente messaggio:

Previsto /blog-app/api/resources/post.rb per definire Messaggio


SOLUZIONE (grazie a dB. ei miei collaboratori)

Devi cambiare la struttura a qualcosa di simile:

app 
- api 
    api.rb 
    - resources 
    - post_api.rb 

Poi, nel post_api.rb

module Blog 
    class Resources::PostAPI < Grape::API 
    resource :posts do 
     get do 
     present Post.all 
     end 
    end 
    end 
end 

Infine, il api .rb diventa:

require 'grape' 
module Blog 
    class API < Grape::API 
    prefix 'api' 
    version 'v1', :using => :path 
    format :json 

    mount Blog::Resources::PostAPI => '/' 
    end 
end 

Ora /api/v1/posts dovrebbe funzionare :)

+1

Cosa accadrebbe se avessi un'altra versione di API - v2 e vorrei esporre un nome diverso del contenuto dell'attributo, quindi diciamo che avrei expero: body''' invece di '' 'expose: content '' 'nel frattempo dovrò ancora avere il supporto per v1. Penso che inizierò a inserire Entities nella cartella delle versioni, ho ragione? O come lo gestiresti in questa configurazione? –

risposta

7

La classe in post.rb deve essere Posta, non API. Quindi puoi montare l'API Post all'interno dell'API classe.

class API < Grape::API 
    mount Blog::Post => '/' 
end 

Per evitare confusioni, inserire Post in uno spazio dei nomi Risorse o rinominarlo in PostAPI.

+0

Grazie mille @dB. In effetti devi namespace E rinominare per rail per non farti confondere ... funziona ora! – X2theZ

+0

Nota che dovresti essere in grado di omettere il lato destro di 'mount', quindi dovresti installare' Blog :: Resources :: PostAPI', non è necessario eseguire il mount su '/'. –

1

ho scoperto che non lavorare per prefisso del percorso:

mount Blog::Post => '/blog' 

non funziona se si vuole avere il prefisso del percorso.

uso

namespace :blog do 
    mount Blog::Post 
end 

Speranza che aiuta!