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>

Link to this section Summary

Link to this section Functions

Link to this function

validate_url(changeset, field, opts \\ [])

View Source