2013-10-11 1 views
5

Для причин, я хочу, чтобы один контроллер обрабатывал html-запросы и другой дескриптор json api-запросов.Rails routing: ограничения формата, когда ни один не указан

Я получил это в моих маршрутах:

scope module: :api, as: :api do 
    constraints format: :json do 
    resources :users 
    end 
end 
constraints format: :html do 
    resources :users 
end 

Это прекрасно работает, когда URL спортивный суффикс: /users.json проходит через мой Api::UsersController а ля api_users_path; /users.html проходит через мой UsersController à la users_path.

Однако это не ведет себя так, как ожидалось, когда в URL-адресе нет суффикса. Реализация ограничений, связанных с лямбда-шоу, идет не так:

#=> visiting /users 

scope module: :api, as: :api do 
    constraints ->(request){ puts "In api: #{request.format}"; request.format == :json } do 
    resources :users 
    end 
end 
constraints ->(request){ puts "In html: #{request.format}"; request.format == :html } do 
    resources :users 
end 

#=> In api: text/html 
#=> (request.format == :json) => false 

и все же он попадает в контроллер api.

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

я не могу найти способ, чтобы написать ограничение, которое перехватывает, когда URL отсутствует суффикс, и я не чувствую, как будто я должен request.format == :html отчеты to-правда, когда я к навигации /users. Почему второе ограничение не улавливает?

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

Кто-нибудь знает, как применять эти ограничения по-разному, чтобы эффективно включить любой формат, а не только суффикс url, или иметь явное ограничение, которое не поддерживает суффикс формата?

+0

на второй contraint косяк поймать, что маршрут оленья кожа матч – apneadiving

+0

Почему вы не просто установить формат запроса себя для всех действий в вашем апи ? – apneadiving

+0

на самом деле, так как вы прописываете свой контроллер, я не понимаю, зачем вам нужны ограничения маршрута. – apneadiving

ответ

3

Я не думаю, что вам нужен второй блок ограничений (один для :html). Я думаю, что это должно делать то, что вы хотите:

scope module: :api, as: :api do 
    constraints format: :json do 
    resources :users 
    end 
end 

resources :users 
+0

Удивительно, но нет! Это по-прежнему отклоняет '/ users' как' text/html' на контроллер api, вызывая 406. –

+0

Создание чистого приложения показывает, что это работает, поэтому в стеке моего приложения есть что-то, что глубоко возится с вещами. Когда я это выясню, я отправлю его здесь, но поскольку эта награда скоро истечет ... –

+0

Augh, пропустил ее на минуту. :/ –

1

Расширения ответа Джереми .. Что делать, если вы вставить HTML пользователей по умолчанию маршрутов до тха апи рамок для маршрутов?

как,

resources :users 
scope module: :api, as: :api do 
    constraints format: :json do 
    resources :users 
    end 
end 

Как ни странно, это работает для меня!

+0

Изменение порядка, с ограничениями или без ограничений * работает *, что я и делаю сейчас. Я упомянул: «Хотя я мог бы« исправить »это, изменив порядок этих двух, я бы скорее знал, почему мои ограничения не работают правильно». «Потому что, пока наложение маршрутов не было моим вызовом, d, скорее всего, будут иметь маршруты API для API-ориентированного приложения. –

+0

Aww .. Мой плохой! Прошел вопрос быстро .. Но учитывая, что Ruby является языком, управляемым процедурой. Это должно быть лучшим решением. – Aditya

1

Установка формата по умолчанию без суффикса, который должен быть json, должен заботиться о ваших потребностях.

scope module: :api, as: :api, defaults: { format: :json} do 
    constraints format: :json do 
    resources :users 
    end 
end 

только явные запросы суффикс .html в конечном итоге на этом ресурсе

resources :users 
Смежные вопросы