Ecto Commons v0.1.0 EctoCommons.URLValidator View Source
This validator is used to validate URLs.
Options
There are some available options depending on the strictness of what you want to validate:
:parsable
: Checks to see if the URL is parsable by:http_uri.parse/1
Erlang function. This can have issues with international URLs where it should be disabled (see tests). Defaults to enabled:empty
: Checks to see if the parsed%URI{}
struct is not empty (all fields set to nil). Defaults to enabled:scheme
: Checks to see if the parsed%URI{}
struct contains a:scheme
. Defaults to enabled:host
: Checks to see if the parsed%URI{}
struct contains a:host
. Defaults to enabled:valid_host
: Does a:inet.getbyhostname/1
call to check if the host exists. Defaults to disabled:path
: Checks to see if the parsed%URI{}
struct contains a:path
. Defaults to disabled:regexp
: Tries to match URL to a regexp known to catch many unwanted URLs (see below). Defaults to disabled
The approach is not yet very satisfactory IMHO, if you have suggestions, Pull Requests are welcome :)
Example:
iex> types = %{url: :string}
iex> params = %{url: "https://www.example.com/"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_url(:url)
#Ecto.Changeset<action: nil, changes: %{url: "https://www.example.com/"}, errors: [], data: %{}, valid?: true>
iex> types = %{url: :string}
iex> params = %{url: "https://www.example.com/"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_url(:url, checks: [:empty, :path, :scheme, :host])
#Ecto.Changeset<action: nil, changes: %{url: "https://www.example.com/"}, errors: [], data: %{}, valid?: true>
iex> types = %{url: :string}
iex> params = %{url: "some@invalid_url"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_url(:url)
#Ecto.Changeset<action: nil, changes: %{url: "some@invalid_url"}, errors: [url: {"is not a valid url", [validation: :url]}], data: %{}, valid?: false>
iex> types = %{url: :string}
iex> params = %{url: "Just some random text"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_url(:url)
#Ecto.Changeset<action: nil, changes: %{url: "Just some random text"}, errors: [url: {"is not a valid url", [validation: :url]}], data: %{}, valid?: false>