Le code pour les intervenants en fonction dans une classe et d'un module. MimeResponds qui est inclus dans ActionController::Base, la classe de votre ApplicationController
hérite. Puis il y a ActionController::Répondeur qui fournit le comportement par défaut lors de l'utilisation de respond_with.
Par défaut, le seul comportement rails fournit la réponse est implicite et tenter de rendre un modèle avec un nom correspondant à l'action. Rien au-delà qui nécessite plus d'instructions à l'intérieur de l'action, ou une coutume respond_to appel avec un bloc de gérer plusieurs format de réponses.
Comme la plupart des contrôleurs de l'utilisation d'un motif assez commun, de la personnalisation, les intervenants d'apporter un niveau supplémentaire d'abstraction par l'introduction de plus le comportement par défaut. Lire les actions appelant to_xml/to_json pour des formats spécifiques, et mutateur actions en offrant les mêmes ainsi que les redirections pour la réussite de mutateur actions.
Il y a quelques possibilités pour personnaliser la façon dont les intervenants se comporter, de subtiles retouches complètement de la substitution ou de l'extension de la comportement.
Le Niveau De La Classe: respond_to
Ici, vous devez spécifier les formats que le Répondeur doit traiter. Les formats peuvent être personnalisés pour les actions qu'ils vont s'appliquer. Chaque format peut être spécifiée avec des appels distincts, permettant une personnalisation complète des actions pour chaque format.
# Responds to html and json on all actions
respond_to :html, :json
# Responds to html and json on index and show actions only.
respond_to :html, :json, :only => [:index,:show]
# Responds to html for everything except show, and json only for index, create and update
respond_to :html, :except => [:show]
respond_to :json, :only => [:index, :create, :update]
Le Niveau De La Classe: responder
C'est un attribut de classe qui détient le répondeur. Cela peut être quelque chose qui répond à l'appel, ce qui signifie que vous pouvez utiliser une proc/lambda ou une classe qui répond à l'appel. Une autre alternative est de mixin un ou des modules existants répondeur à la surcharge de méthodes existantes, augmentant le comportement par défaut.
class SomeController < ApplicationController
respond_to :json
responder = proc do |controller, resources, options|
resource = resources.last
request = controller.request
if request.get?
controller.render json: resource
elsif request.post? or request.put?
if resource.errors.any?
render json: {:status => 'failed', :errors => resource.errors}
else
render json: {:status => 'created', :object => resource}
end
end
end
end
Alors qu'il peut être intéressant de bord de cas d'utilisation, il est plus probable que l'extension ou le mélange des modules dans le répondeur par défaut serait plus courants. Dans tous les cas, les options qui sont pertinents sont les ressources et les options, comme ils sont transmis par le biais de la respond_with.
Niveau De L'Instance: respond_with
Les options sont les mêmes que ceux qui seraient passés à rendre ou redirect_to dans votre contrôleur, mais ils ne sont inclus que pour la réussite des scénarios. Pour OBTENIR ces actions serait le rendu des appels, d'autres actions, ce serait les options de redirection. Probablement le plus utile est l' :location
option, qui peut être utilisé pour remplacer le chemin de redirection dans le cas où les arguments en faveur de respond_with ne sont pas suffisants pour construire l'URL.
# These two are essentially equal
respond_with(:admin, @user, @post)
respond_with(@post, :location => admin_user_post(@user, @post)
# Respond with a 201 instead of a 200 HTTP status code, and also
# redirect to the collection path instead of the resource path
respond_with(@post, :status => :created, :location => posts_path)
# Note that if you want to pass a URL with a query string
# then the location option would be needed.
# /users?scope=active
respond_with(@user, :location => users_path(:scope => 'active'))
Comme alternative, les intervenants gem ne fournit pas seulement certains modules pour remplacer certains de le comportement par défaut. Il remplace le répondeur par défaut avec une classe anonyme qui s'étend le répondeur par défaut, et fournit un niveau de classe de la méthode pour le mélange des modules personnalisés à cette classe. Le plus utile est le flash de répondeur, qui fournit un ensemble par défaut de bouffées de chaleur, la délégation de la personnalisation du système I18n, config/locales/en.yml
par défaut.
Quelques exemples de la coutume des intervenants que j'ai utilisé dans de précédents projets incluent un répondeur qui automatiquement décorées de mes ressources, et a fourni un ensemble par défaut de la page de titres, avec une interface pour faciliter la personnalisation ou de la substitution de la page de titre.