2015-11-27 14 views
7

Bu küçük sanitasyon fonksiyonunda bir Phoenix/Elixir uygulamasında, kullanıcı bir e-posta girmediğinde sorun yaşıyorum.Yapı koruma maddelerindeki yapıların değerleri nasıl test edilir?

Verileri ele almak için bir yapı kullanıyorum. Ve basit bir sanitasyon işlevi (şimdilik) sadece boşlukları keser ve yapıyı günceller (harita). Şimdiye kadar iyi çalıştı, ancak email alanı nil olduğunda, bir hata alıyorum.

** (FunctionClauseError) no function clause matching in String.Unicode.strip/1 

Yani bu durumda kontrol etmek için bir bekçi maddesini tanıtıldı ve sonra yalnızca kullanıcı adı sterilize.
defmodule MyApp.User do 
    defstruct username: nil, email: nil, password: nil, hashed_password: nil 

    # Sanitizing input without guard clause 
    def sanitize_user(user)do 
    %{user | username: String.strip(user.username), email: String.strip(user.email)} 
    end 


    # Sanitizing input with guard clause 
    def sanitize_user(user) when is_nil(user.email) do 
    %{user | username: String.strip(user.username)} 
    end 
    def sanitize_user(user) when is_binary(user.email) do 
    %{user | username: String.strip(user.username), email: String.strip(user.email)} 
    end 
end 

Şimdi derleme zamanında bir hata alıyorum:

** (CompileError) web/models/user.ex:54: cannot invoke remote function Access.get/2 inside guard 

ben bu alan için derleme zamanını mevcut değildir çünkü sanırım. Ya da böyle bir şey.

Bu nasıl çözülür? Koruma maddelerindeki yapıların değerleri nasıl test edilir?

cevap

18

Derleme zamanında bulunmayan değerler hakkındaki varsayımlarınız doğrudur. Bununla birlikte, desen haritanızdaki değerlerle eşleşebilir ve bunları bir bekçide kullanabilirsiniz.

: Eğer (bu durumda olası) bir diğer yapılar geçirilmesine izin vermek istiyorsanız

def sanitize_user(%MyApp.User{email: nil} = user) do 
    %{user | username: String.strip(user.username)} 
    end 
    def sanitize_user(%MyApp.User{email: email} = user) when is_binary(email) do 
    %{user | username: String.strip(user.username), email: String.strip(user.email)} 
    end 

Ayrıca, User yapı olmadan bir harita üzerinde eşleşebilir: gibi

Sen işlevini yazabilirsiniz

def sanitize_user(%{email: nil} = user) 
+0

Teşekkürler! Bu çözüldü. Btw. İkinci fonksiyon tanımında bir yazım hatası var (ilk çözümden). Bir açıklık var (çok fazla. –

+0

İyi nokta. Yazım hatası düzeltildi.) – Gazler

+0

@OleSpaarmann: Bu cevabı çözülmüş olarak işaretlemek Gazler için daha güzel olurdu. – raarts

İlgili konular