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