2013-12-24 3 views
0

В рамках приложения Padrino У меня есть сообщения контроллер с обычными маршрутами:Padrino приложение с REST API

Blog::App.controllers :posts do 

    get :index do 
    ... 
    end 

    get :show, :with => :id do 
    ... 
    end 

end 

Это дает мне поэтому нормальный доступ к URL в пределах сообщений имен

http://blog.dev/posts 
http://blog.dev/posts/show/1 

Теперь я хочу предоставить доступ через API REST с другого маршрута за пределами пространства имен, например:

http://blog.dev/api/v1/post/all 
http://blog.dev/api/v1/post/1 

Как я могу определить API для моих сообщений контроллера с маршрутами за пределами своих нормального пространства имен?

Должен признать, что я не уверен, что мой подход является общим. Я мог бы определить новый контроллер API V1, но в этом случае мне придется дублировать информацию о сообщениях в двух разных местах.

В случае, если это необходимо сделать с помощью контроллера API, интересно, какие камни и/или условные обозначения обычно используются для этой задачи. В идеале я хотел бы что-то, что координирует различные версии API с текущим объектом модели.

+0

[This] (http://railscasts.com/episodes/350-rest-api-versioning) - это учебник по рельсам. Хотя, я не вижу причин, почему основная логика не могла быть использована в вашем случае. –

+1

Вы клиент и API должны быть отдельными. Затем клиент мог вызывать API для данных, а не быть API в другом пространстве имен. –

ответ

2
Blog::App.controllers :posts, map: '/api/v1/posts' do 

    get :index do 
    ... 
    end 

end 

И затем, если вы хотите добавить новые версии этого контроллера

Blog::App.controllers :v2_posts, map: '/api/v2/posts' do 

    get :index do 
    ... 
    end 

end 

(Да, это, кажется, вы не можете иметь несколько файлов с тем же контроллером с различными значениями map.)

Таким образом, это не будет работать (извините, если это работает, то не когда я пробовал) правильно и будет вызывать вопросы:

Blog::App.controllers :posts, map: '/api/v1/posts' do 

    get :index do 
    ... 
    end 

end 

Blog::App.controllers :posts, map: '/api/v2/posts' do 

    get :index do 
    ... 
    end 

end 
Смежные вопросы