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.
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.
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
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)/}
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