Ejecutar acciones después de las acciones de creación o actualización exitosas en InheritedResources

StackOverflow https://stackoverflow.com/questions/6317389

Pregunta

Actualmente estoy desarrollando un par de módulos para reutilizar el código de mis controladores en un Rails 3 utilizando la aplicación HeritedResources (última versión).

Mi idea es tener algún comportamiento que deba ejecutarse después de una creación o actualización exitosa del recurso, pero, excepto de redeclar las acciones de "crear" o "actualizar", no estoy seguro de cómo abordar esto.

Actualmente estoy usando algo como

module SessionStorable

  extend ActiveSupport::Concern
  include Base

  included do
    before_filter :setup_resource, :only => :new
    after_filter :reset_session_resource_id, :only => [:create, :update]
  end


  # ....

end

Tengo una configuración de recursos particular que uso que, entre otras cosas, agrega la ID del recurso a la sesión. Después de que el recurso se haya guardado con éxito en el BD, me gustaría eliminar su ID de la sesión y eso es lo que hace el After_Filter.

Hasta ahora, he tratado con él también guardando la información actualizada_at en la sesión y en comparación para ver si el modelo se actualizó (si es así, debería haber sido correctamente) y ejecutar el método.

Sin embargo, no estoy contento con eso (un poco hacky) y también planeo tener otros módulos que funcionen con recursos también después de que se hayan actualizado y no querrían usar el mismo enfoque dos veces.

¿Hay un gancho en IR que debería estar usando? ¿O alguna otra idea sobre cómo proceder?

¿Fue útil?

Solución

Lo he resuelto usando el "Object.errors.empty?" condición. Si no hay errores en el objeto después de la acción Crear o actualizar, debe ser seguro asumir que el modelo se guardó correctamente y, por lo tanto, ejecutar el código estaría bien.

Otros consejos

Tal vez podría usar un enfoque basado en la herencia: en su lugar:

class BaseController < InheritedResources::Base

before_filter :setup_resource, :only => :new
after_filter :reset_session_resource_id, :only => [:create, :update]

# ...
end

class YourController < BaseController
# ...
end

Lamento usar la función de respuesta para un comentario, pero como no puedo hacerlo bajo su respuesta, no veo otra opción.

"Object.errors.empty?" condición. Si no hay errores en el objeto después de la acción de creación o actualización, debe ser seguro asumir que el modelo se guardó correctamente

Creo que esto no siempre es cierto, déjame ponerte y ejemplo:

class Project < ActiveRecord:Base
  has_many :members
  # ...
end

Imagine que tiene un formulario para el proyecto donde también podría crear miembros para él (formularios anidados). Los errores en la creación de los miembros asociados hará que el objeto de proyecto sea inválido, pero la instancia del proyecto devolverá verdadero para el método errores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top