Rails 3 - Ограничение форматов для действий в ресурсных маршрутах - PullRequest
36 голосов
/ 15 февраля 2011

В моих маршрутах определен ресурс.

resources :categories

И у меня в контроллере категории есть следующее:

  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?Это должно происходить только в шоу-акции.

Каков наилучший способ добиться этого?Также есть ли полезные советы по СУШКЕ блока response_to?

Спасибо за вашу помощь.

Ответы [ 4 ]

41 голосов
/ 15 февраля 2011

Я обнаружил, что это сработало (спасибо @Pan за указание в правильном направлении):

resources :categories, :except => [:show]
resources :categories, :only => [:show], :defaults => { :format => 'json' }

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

36 голосов
/ 09 октября 2012

Вы должны обернуть эти маршруты в область, если вы хотите ограничить их определенным форматом (например, 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 - ограничение доступных форматов для ресурса

24 голосов
/ 15 февраля 2011

Вы можете сделать следующее в вашем файле rout.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)/}
0 голосов
/ 17 июля 2016

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

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