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"}
]
endThere 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/2function:always_change- if this option is set slug will be recreated from the given sources each timemaybe_generate_slugfunction 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
endSee 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.