2016-09-25 109 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