web-dev-qa-db-fra.com

Rails 3 - Restriction des formats d'action dans les itinéraires de ressources

J'ai une ressource définie dans mes itinéraires.

resources :categories

Et j'ai les éléments suivants dans mon contrôleur de catégorie:

  def show
    @category = Category.find(params[:id])

    respond_to do |format|
      format.json { render :json => @category }
      format.xml  { render :xml => @category }
    end
  end

L'action du contrôleur fonctionne bien pour JSON et XML. Cependant, je ne veux PAS que le contrôleur réponde aux requêtes au format html. Comment puis-je autoriser uniquement json et xml? Cela ne devrait se produire que dans l'action.

Quel est le meilleur moyen de réaliser cela?

Merci de votre aide.

36
Mike

J'ai trouvé que cela semblait fonctionner (merci à @Pan de m'avoir orienté dans la bonne direction):

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

Ce qui précède semble forcer le routeur à répondre à une requête sans format, à l’action show, sous la forme json par défaut.

41
Mike

Vous devez inclure ces itinéraires dans une étendue si vous souhaitez les restreindre à un format spécifique (par exemple, html ou json). Les contraintes ne fonctionnent malheureusement pas comme prévu dans ce cas.

Ceci est un exemple d'un tel bloc ...

scope :format => true, :constraints => { :format => 'json' } do
  get '/bar' => "bar#index_with_json"
end

Plus d'informations peuvent être trouvées ici: https://github.com/Rails/rails/issues/5548

Cette réponse est copiée de ma réponse précédente ici ..

Routes Rails - Limiter les formats disponibles pour une ressource

35
koonse

Vous pouvez effectuer les opérations suivantes dans votre fichier routes.rb pour vous assurer que seule l'action show est limitée à json ou xml:

resources :categories, :except => [:show]
resources :categories, :only => [:show], :constraints => {:format => /(json|xml)/}

Si cela ne fonctionne pas, vous pouvez essayer de faire correspondre explicitement l'action:

resources :categories, :except => [:show]
match 'categories/:id.:format' => 'categories#show', :constraints => {:format => /(json|xml)/}
24
Pan Thomakos

constraints ne fonctionnait pas pour les demandes POST puis j'ai essayé defaults, cela fonctionnait pour tous.

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

J'utilisais Rails 4.2.7

0
A H K