Rails 3 - Ограничение форматов действий в маршрутах ресурсов
У меня есть ресурс, определенный в моих маршрутах.
resources :categories
И у меня в контроллере Category есть следующее:
def show
@category = Category.find(params[:id])
respond_to do |format|
format.json { render :json => @category }
format.xml { render :xml => @category }
end
end
Действие контроллера отлично работает для json и xml. Однако я НЕ хочу, чтобы контроллер отвечал на запросы формата html. Как я могу разрешить только json и xml? Это должно произойти только в действии show.
Каков наилучший способ достичь этого?
Также есть ли хорошие советы для СУШЕНИЯ блока response_to?
Спасибо за вашу помощь.
Ответы
Ответ 1
Я обнаружил, что это похоже на работу (спасибо @Pan за то, что указали мне в правильном направлении):
resources :categories, :except => [:show]
resources :categories, :only => [:show], :defaults => { :format => 'json' }
Вышеизложенное, похоже, заставляет маршрутизатор обслуживать запрос без формата, к действию show, по умолчанию json.
Ответ 2
Вы должны обернуть эти маршруты в область видимости, если хотите ограничить их определенным форматом (например, html или json). К сожалению, ограничения в этом случае не работают должным образом.
Это пример такого блока...
scope :format => true, :constraints => { :format => 'json' } do
get '/bar' => "bar#index_with_json"
end
Дополнительную информацию можно найти здесь: https://github.com/rails/rails/issues/5548
Этот ответ копируется из моего предыдущего ответа здесь.
Rails Routes - ограничение доступных форматов для ресурса
Ответ 3
В файле routes.rb вы можете сделать следующее: убедитесь, что только действие show ограничено json или xml:
resources :categories, :except => [:show]
resources :categories, :only => [:show], :constraints => {:format => /(json|xml)/}
Если это не сработает, вы можете попробовать явно сопоставить действие:
resources :categories, :except => [:show]
match 'categories/:id.:format' => 'categories#show', :constraints => {:format => /(json|xml)/}
Ответ 4
constraints
не работал для запросов POST, а затем я попробовал defaults
он работает для всех.
namespace :api, :defaults => { :format => 'json' } do
namespace :v1 do
resources :users do
collection do
get 'profile'
end
end
post 'signup' => 'users#create'
post 'login' => 'user_sessions#create'
end
end
Я использовал Rails 4.2.7