2013-02-13 6 views
14

In jedem Beispiel sehe ich, Menschen implementieren nur eine riesige api.rb-Datei. Ex:Wie teilt man die Dinge in einer Weintrauben-App auf?

Während dieser Ansatz in Ordnung können wie funktioniert, ist es schnell voll werden kann und schwer zu halten, so würde Ich mag Dinge aufzuspalten auf meinem App

Zum Beispiel möchte ich meine Entitäten von meinen Ressourcen trennen und dann meine Ressourcen zwischen verschiedenen Dateien aufteilen. Beispiele:

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

Nun api.rb wäre so etwas wie:

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

app/api/Einheiten/post.rb wäre so etwas wie sein:

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

app/api/resources/post.rb wäre etwas wie:

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 

Wenn wir dies tun, stoßen wir auf die folgende Meldung:

Erwartet /blog-app/api/resources/post.rb Beitrag


definieren LÖSUNG (dank dB. und meine Mitarbeiter)

Sie haben die Struktur etwas ändern wie:

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

Dann wird in der post_api.rb

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

schließlich die api .rb wird:

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

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

Jetzt sollte /api/v1/posts funktionieren :)

+1

Was wäre passiert, wenn ich eine andere Version von API - v2 hätte und ich würde einen anderen Namen des Attribut - Inhalts veröffentlichen wollen, also würde ich '' 'expose: body' '' anstelle von '' 'expose: content haben '' 'Inzwischen muss ich noch Unterstützung für v1 haben. Ich denke, ich werde Entitäten in den Versionsordner stellen, habe ich recht? Oder wie würdest du das in diesem Setup handhaben? –

Antwort

7

Die Klasse in post.rb sollte Post sein, nicht API. Dann können Sie die Post-API innerhalb der Klassen-API mounten.

Um Verwechslungen zu vermeiden, würde ich Post auch in einen Resources-Namespace stellen oder in PostAPI umbenennen.

+0

Vielen Dank @dB. In der Tat müssen Sie Namespace und umbenennen für Schienen, um nicht verwirrt zu werden ... funktioniert jetzt! – X2theZ

+0

Beachten Sie, dass Sie in der Lage sein sollten, die rechte Seite von 'mount' wegzulassen, also sollte' mount Blog :: Resources :: PostAPI' funktionieren, Sie müssen nicht auf '/' mounten. –

1

Ich fand es nicht für Pfadpräfix arbeiten:

mount Blog::Post => '/blog' 

funktioniert nicht, wenn Sie Präfix wollen den Pfad haben.

Verwendung

namespace :blog do 
    mount Blog::Post 
end 

Hoffe, es hilft!

Verwandte Themen