2016-09-25 141 views
0

我有一個不應該用作用戶名的字符串列表。我發現在ecto中有validate_exclusion,但我認爲在不區分大小寫的情況下有辦法做到這一點。有沒有辦法做到這一點? validate_format與正則表達式也許?忽略大小寫validate_exclusion

  • 注意:我想避免簡單地將我的用戶名縮減。

回答

1

我最終改用validate_change代替。

def changeset(struct, params \\ %{}) do 
    struct 
    ... 
    |> validate_change(:username, validate_restricted_usernames) 
end 

@restricted_usernames ~w(about faq...) 
def validate_restricted_usernames do 
    fn :username, username -> 
    case Enum.any?(@restricted_usernames, fn x -> x == String.downcase(username) end) do 
     true -> [username: "username is already taken."] 
     false -> [] 
    end 
    end 
end 
+1

相反Enum.any的'(@ restricted_usernames,FN X - > X == String.downcase(用戶名)結束)'可以做'String.downcase(用戶名)嗎? @ restricted_usernames' –

+0

不錯的建議@OleksandrAvoyants –

0

你(回答)說,你已經使用validate_change, 但實際上你卻沒有。 這裏是變異與validate_change/3

def changeset(struct, params \\ %{}) do 
    struct 
    # ... 
    |> validate_change(:username, fn :username, username -> 
    if String.downcase(username) in @restricted_usernames, do: [username: "is restricted"], else: [] end) 
end