ruby on rails - que - Rails responden con: ¿cómo funciona?
ruby on rails que es (1)
He estado leyendo aquí y allá sobre cuán genial es el método de respond_with
en Rails 3. Pero ni siquiera puedo encontrar una referencia en las API de Rails o buscando en la fuente. ¿Alguien puede explicarme cómo funciona (qué opciones puede usar, etc.) o indicarme el lugar en el que está implementado para que pueda leer el código por mi cuenta?
Actualización para Rails 4.2+
#respond_with
y ::respond_to
(método de clase nb ) ya no forman parte de Rails . Se migraron a la gema de responders terceros a partir de Rails 4.2 ( notas de la versión / commit de agosto de 2014). Si bien los respondedores no están incluidos en Rails de manera predeterminada, es una dependencia de Devise y, por lo tanto, está disponible en muchas aplicaciones de Rails.
El método de instancia #respond_to
, sin embargo, sigue siendo una parte de Rails (5.2rc1 a partir de este escrito).
La documentación oficial de Rails API para ActionController::MimeResponds
explica cómo funciona #respond_to
. Los comentarios originales de documentación de Rails Guides para #respond_with
y ::respond_to
aún se pueden encontrar en el código fuente gema del respondedor .
Respuesta original
El código para los respondedores se basa en una clase y un módulo. MimeResponds que se incluye en ActionController::Base , la clase MimeResponds ApplicationController
. Luego está ActionController::Responder que proporciona el comportamiento predeterminado al usar responder_con.
Por defecto, los únicos rieles de comportamiento que se proporcionan en la respuesta son un intento implícito de representar una plantilla con un nombre que coincida con la acción. Cualquier cosa más allá de eso requiere más instrucciones dentro de la acción, o una respuesta personalizada para llamar con un bloque para manejar múltiples respuestas de formato.
Como la mayoría de los controladores usan un patrón bastante común de personalización, los respondedores proporcionan un nivel extra de abstracción al introducir más comportamiento predeterminado. Lea las acciones que llaman a_xml / to_json para formatos específicos, y las acciones de los mutatores proporcionan lo mismo, así como redirecciones para las acciones exitosas de los mutadores.
Hay algunas oportunidades para personalizar el comportamiento de los respondedores, desde ajustes sutiles hasta anular por completo o ampliar el comportamiento.
Nivel de clase: respond_to
Aquí especifica los formatos que el Respondedor debe manejar. Los formatos se pueden personalizar en cuanto a las acciones a las que se aplicarán. Cada formato se puede especificar con llamadas separadas, lo que permite una personalización completa de las acciones para cada formato.
# 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]
Nivel de clase: responder
Este es un atributo de clase que contiene el respondedor. Esto puede ser cualquier cosa que responda a una llamada, lo que significa que puede usar un proc / lambda o una clase que responde a una llamada. Otra alternativa es mezclar uno o más módulos con el respondedor existente para sobrecargar los métodos existentes, lo que aumenta el comportamiento predeterminado.
class SomeController < ApplicationController
respond_to :json
self.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
Si bien puede haber algunos casos de uso de bordes interesantes, es más probable que la extensión o la mezcla de módulos en el respondedor predeterminado sean patrones más comunes. En cualquier caso, las opciones que son relevantes son los recursos y las opciones, a medida que pasan de from from response_with.
Nivel de instancia: respond_with
Las opciones aquí son aquellas que se pasarían para renderizar o redirigir_ a su controlador, pero solo se incluyen para escenarios de éxito. Para las acciones GET estas serían las llamadas de renderizado, para otras acciones, estas serían las opciones para redirigir. Probablemente la más útil de estas es la opción :location
, que se puede utilizar para anular esa ruta de redireccionamiento en caso de que los argumentos para responder_con no sean suficientes para construir la URL correcta.
# 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''))
Como alternativa, la gema responders no solo proporciona algunos módulos para anular algunos de los comportamientos predeterminados. Anula el respondedor predeterminado con una clase anónima que amplía el respondedor predeterminado y proporciona un método de nivel de clase para mezclar módulos personalizados con esta clase. La más útil aquí es la respuesta flash, que proporciona un conjunto predeterminado de flashes, delegando la personalización al sistema I18n, config/locales/en.yml
de forma predeterminada.
Algunos ejemplos de respondedores personalizados que he usado en proyectos anteriores incluyen un respondedor que automáticamente decoró mis recursos, y proporcionó un conjunto predeterminado de títulos de página con una interfaz para personalizar fácilmente o anular el título de la página.