Pregunta Devoluciones de Phoenix Framework


¿Phoenix Framework emplea algún tipo de filtro de devolución de llamada como los que se encuentran en Carriles? Sé que es posible validar conjuntos de cambios, pero estoy buscando formas de implementar acciones tales como before_create, before_save y after_commit.


8
2018-04-27 20:30


origen


Respuestas:


Ecto hace: https://hexdocs.pm/ecto/#!Ecto.Model.Callbacks.html

Son visualmente diferentes de los de Rails: reciben y deben devolver conjuntos de cambios y se deben usar para la coherencia de los datos (no los use para enviar correos electrónicos y lo que no).


13
2018-04-27 20:54



Desde Ecto 2.0, las devoluciones de llamada se han eliminado por completo. 

Entonces, ¿cómo manejar las devoluciones de llamada ahora? Aquí hay dos maneras

por before_ devoluciones de llamadas que puede usar Changeset sí mismo. Una de las razones por las que las devoluciones de llamada se eliminaron fue porque muchos desarrolladores se basaron en devoluciones de llamadas en muchos casos donde los conjuntos de cambios serían suficientes. Así que simplemente aplique la función requerida a su conjunto de cambios,

def changeset(post, params \\ :empty) do
  post
  |> cast(params, @required_params, @optional_params)
  |> validate_length(:title, min: 3)
  |> validate_length(:metadata, min: 3)
  |> implement_a_before_callback
end

def implement_a_before_callback(changeset)
   #Apply required actions and return Changeset
end

Otra forma es agrupar varias operaciones de reporto usando Ecto.Multi. De los documentos

Ecto.Multi hace posible empacar las operaciones que se deben realizar juntas (en una sola transacción de base de datos) y ofrece una manera de introspectar las operaciones en cola sin realmente realizarlas. A cada operación se le asigna un nombre que es único e identificará su resultado o ayudará a identificar el lugar de falla en caso de que ocurra.   Entonces, cuando quiera que un grupo de operaciones relacionadas con datos suceda de una vez, podría usar Multi, ambos before_ y after_ las devoluciones de llamada pueden ser sustituidas aquí.

Un ejemplo sería

  # In defmodule Service
  def password_reset(account, params) do
    Multi.new
    |> Multi.update(:account, Account.password_reset_changeset(account, params))
    |> Multi.insert(:log, Log.password_reset_changeset(account, params))
    |> Multi.delete_all(:sessions, assoc(account, :sessions))
  end

Ejecutarlo usando

result = Repo.transaction(Service.password_reset(account, params))

Debe recordar que debe ejecutar consultas relacionadas con los datos y no realizar otras tareas, como enviar un correo electrónico. Para eso, puedes simplemente emparejar patrones en el resultado y realizar la acción adecuada. Permite que se sienta que desea enviar un correo si la transacción fue exitosa y mostrar un mensaje de error si no

case result do
  {:ok, %{account: account, log: log, sessions: sessions}} ->
    # Operation was successful, perform actions like sending a mail
  {:error, failed_operation, failed_value, changes_so_far} ->
    # One of the operations failed. Raise error message
end

Fuente:


12
2018-06-26 14:44