Skip to content

Instantly share code, notes, and snippets.

@eteubert
Created April 3, 2018 10:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eteubert/45b84e86b504c3a68a43d3444684a09b to your computer and use it in GitHub Desktop.
Save eteubert/45b84e86b504c3a68a43d3444684a09b to your computer and use it in GitHub Desktop.
Filter / Params in Phoenix Controllers
defmodule NeulandWeb.Admin.EpisodeController do
use NeulandWeb, :controller
alias Neuland.Repo
alias Neuland.Directory
alias Neuland.Directory.EpisodeParams
@episodes_per_page 100
def index(conn, %{"filter" => filter_params}) do
changeset =
EpisodeParams.changeset(%EpisodeParams{}, filter_params)
|> Ecto.Changeset.put_change(:items_per_page, @episodes_per_page)
if !changeset.valid? do
render(conn, "error.html", %{errors: changeset.errors})
else
episodes =
changeset
|> EpisodeParams.to_params()
|> Directory.list_episodes()
|> Repo.preload(:podcast)
render(conn, "index.html", episodes: episodes, filter: filter_params)
end
end
def index(conn, _params) do
episodes =
Directory.list_episodes(%{"items_per_page" => @episodes_per_page})
|> Repo.preload(:podcast)
render(conn, "index.html", episodes: episodes, filter: %{})
end
end
defmodule Neuland.Directory.EpisodeParams do
use Ecto.Schema
import Ecto.Changeset
schema "" do
field(:page, :integer, default: 1)
field(:items_per_page, :integer, default: 10)
field(:podcast_id, :integer)
field(:slug, :string)
field(:search, :string)
field(:ids, :string)
field(:br_domain_id, :string)
field(:title, :string)
end
def changeset(episode_params, attrs) do
episode_params
|> cast(attrs, [
:page,
:items_per_page,
:podcast_id,
:slug,
:search,
:ids,
:title,
:br_domain_id
])
|> validate_number(:page, greater_than: 0)
end
def to_params(changeset) do
%{
"page" => get_field(changeset, :page),
"items_per_page" => get_field(changeset, :items_per_page),
"podcast_id" => get_field(changeset, :podcast_id),
"slug" => get_field(changeset, :slug),
"search" => get_field(changeset, :search),
"ids" => get_field(changeset, :ids),
"title" => get_field(changeset, :title),
"br_domain_id" => get_field(changeset, :br_domain_id)
}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment