Rails - выберите другой шаблон представления на основе запросов - PullRequest
1 голос
/ 27 июня 2011

Я реализую REST API с версионным интерфейсом (например, Twitter API), поэтому в зависимости от версии в запросе мне нужно отобразить шаблон, соответствующий конкретной версии, например, если клиент запрашивает: http://www.foo.com/api/v1/posts.json

Я бы хотел, чтобы контроллер отображал:

posts / index. v1 .json.erb

, но если клиент запрашивает

http://www.foo.com/api/v2/posts.json

Я бы хотел, чтобы контроллер отображал:

posts / index. v2 .json.erb

и так далее.

номер версии в URL будет помещен в хэш params в route.rb.

Я хочу сделать это многоразовым способом, поэтому недопустимо повторять логику в конкретном действии контроллера.

Я пробовал view resolver, однако у него нет доступа к запросу, поэтому я не могу передать номер версии для resolver.

есть ли способ сделать это?

Спасибо!

-Xiaotian

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Вы можете указать номер версии в вашем маршруте.*

0 голосов
/ 27 июня 2011

Думаю, я бы предложил создать отдельный контроллер для каждой версии, возможно, в том же модуле

Api::VersionOneConroller
Api::VersionTwoConroller

или что-то в этом роде, я не знаком со всем вашим приложением, поэтому не могу сказать, сработает ли это, но стоит подумать.

------------ обновление -------------

если разница в версиях заключается только в выводе или создании чего-либо, а все действия делают то же самое, что вы можете добавить после фильтров

class ExampleContrller < ApplicationController 
  after_filter :manage_versions
  ...
end


ApplicationController < ActionController::Base
  protected 
    def manage_versions
      case params[:version]
      when '1.0'
        #response to xml
      when '1.2'
        #response to json
      else 
       # err or default to one
      end
    end
end

что-то подобное может работать

Подробнее о фильтрах читайте здесь http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...