2015-04-27 28 views
8

Phoenix Framework, Rails'da bulunanlar gibi herhangi bir tür geri arama filtresi kullanıyor mu? Ben değişikliklerin doğrulamak mümkün olduğunu biliyorum, ancak before_create, before_save ve after_commit gibi eylemleri uygulamak için yollar arıyorum.Phoenix Framework geri aramaları

cevap

13

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

Onlar Raylar olanlardan göze hitap eden farklıdır: aldıkları ve changesets dönmelidir (e-posta ve ne değil göndermelerini kullanmayın) veri tutarlılığı için kullanılmalıdır.

+0

sayfa "Uyarı: Ecto geri aramaları kullanımdan kaldırılmıştır" diyor. Bu yöntem muhtemelen – coderVishal

+0

Evet önerilmez ve tamamen Ecto 2.0'dan kaldırılmıştır. İşte bazı kararları açıklayan blog yazısı: http://blog.plataformatec.com.br/2015/12/ecto-v1-1-yayınlanmış-ve-ekto-v2-0-planları/ –

+1

Başka bir bakış açısı (Rails'den geliyorsanız): http://cloudless.pl/articles/ 11-model-geri-phoenix-ekto-and-raylar –

11

Ecto 2.0'dan, geri aramalar tamamen kaldırılmıştır.

Peki şimdi geri aramaları nasıl ele alalım? İşte,

'un iki yolu vardır. before_ geri aramaları için Changeset'u kullanabilirsiniz. Kaldırılan yerlerin nedenlerinden biri, birçok geliştiricinin, değişikliklerin yeterli olduğu birçok durumda geri aramalara güvendiğidir. Yani basitçe, senin Changeset için

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 

başka yolu gerekli işlevi uygulamak birlikte Ecto.Multi kullanarak grup birden repo işlemleri etmektir. Dokümanlar

Ecto.Multi mümkün (tek bir veritabanı işlemde) birlikte yapılmalıdır ve aslında bunları gerçekleştirmeden sıraya işlemleri kendi içimize bakmak için bir yol sağlar olmalıdır işlemleri paketi kolaylaştırır. Her operasyona benzersiz bir isim verilir ve sonucunu belirleyecektir ya da meydana gelmesi durumunda başarısızlığın yerini belirlemeye yardımcı olacaktır. Dolayısıyla, bir grup veri ile ilgili işlemlerin bir kerede Multi'u kullanmasını istediğinizde, before_ ve after_ geri aramaları burada değiştirilebilir.

Bir örnek bu veri ile ilgili sorguları yürütmek ve diğer görevleri bir e-seviyorsunuz gerektiğini hatırlamak You have

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

kullanılarak

# 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 

Çalıştır olurdu. Bunun için sonuca basitçe eşleme yapabilir ve uygun eylemi gerçekleştirebilirsiniz. Bazı hata mesajı işlem başarılı olmuşsa, bir posta göndermek ve görüntülemek istedik oturdu Lets değilse

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 

Kaynak:

+1

Bu yoldur! Kabul edilen cevap güncel değil. – LukeS

İlgili konular