travisf
Routing with a custom slug
I have a record where users can provide an optional slug which is a unique_index to provide a friendly name for the URL, how can I go about using this slug if it’s defined otherwise falling back to the resource’s UUID?
live "/records/:id", RecordsLive.Show
IE: live/records/slug-is-defined or live/records//77?
Marked As Solved
ibarch
Ecto will likely raise an error if you try to cast a plain string as UUID so I suggest to determine the datatype on the application level:
live "/records/:opaque_id", RecordsLive.Show
def get_record(opaque_id) do
Record
|> where(^opaque_id_to_query(opaque_id))
|> Repo.one()
end
defp opaque_id_to_query(opaque_id) do
cond do
match?({_, ""}, Integer.parse(opaque_id)) -> [id: opaque_id]
match?({:ok, _}, Ecto.UUID.cast(opaque_id)) -> [uuid: opaque_id]
true -> [slug: opaque_id]
end
end
Also Liked
csadewa
Not necessarily, using or on different field with index usually result in query optimizer combine these two different index in bitwise or operation. Usually it’s not faster to do lookup one then the other because it cause two DB request network latency.
benwilson512
sodapopcan
Have a look at Phoenix.Param. You could do something like:
defimpl Phoenix.Param, for: YourApp.SomeContext.SomeSchema do
def to_param(schema) do
Map.get(schema, :slug, schema.id)
end
end
To offer some unsolicited advice, I think it’ll be far less of a headache in the future if you make slugs non-nullable fields and auto-generate them based off of some other field as to not force users to specify one. Take it or leave it, of course!
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance











