it-swarm-ru.tech

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

У меня есть ресурс, определенный в моих маршрутах.

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?

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

36
Mike

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

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

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

41
Mike

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

35
koonse

Вы можете сделать следующее в своем файле 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)/}
24
Pan Thomakos

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

0
A H K