ecto_autoslug_field
is a reusable Ecto
library which can automatically create slugs from other fields. We use slugify
as a default slug-engine.
We only depend on the ecto
package (we do not deal with ecto_sql
at all).
We support ecto >= 3.7 and ecto < 4
!
See this blog post for more information.
def deps do
[
{:ecto_autoslug_field, "~> 3.1"}
]
end
There are several options to configure.
Required:
:to
- represents the slug field name where to save value to
Optional:
:from
- represents the source fields from which to build slug, if this option is not set you have to overrideget_sources/2
function:always_change
- if this option is set slug will be recreated from the given sources each timemaybe_generate_slug
function is called
get_sources/2
- this function is used to get sources for the slug, docs.build_slug/2
- this function is a place to modify the result slug, docs.
The simplest example:
defmodule EctoSlugs.Blog.Article.TitleSlug do
use EctoAutoslugField.Slug, from: :title, to: :slug
end
defmodule EctoSlugs.Blog.Article do
use Ecto.Schema
import Ecto.Changeset
alias EctoSlugs.Blog.Article
alias EctoSlugs.Blog.Article.TitleSlug
schema "blog_articles" do
field :breaking, :boolean, default: false
field :content, :string
field :title, :string
field :slug, TitleSlug.Type
timestamps()
end
def changeset(model, params \\ :invalid) do
model
|> cast(params, [:title, :content, :breaking])
|> validate_required([:title, :content])
|> unique_constraint(:title)
|> TitleSlug.maybe_generate_slug()
|> TitleSlug.unique_constraint()
end
end
See this tutorial for some more examples.
See CHANGELOG.md.
Copyright (c) 2016 Nikita Sobolev
This library is released under the MIT License. See the LICENSE.md file for further details.