Sheharyar Naseer

Clean Atom parameters in Phoenix


One thing I’ve always hated about working with Phoenix is the fact that I have to use strings to reference web request parameters in controllers. To any other developer, this might sound silly or even insane, but to my OCD-riddled brain, this is pure agony:

# web/controllers/some_controller.ex

def show(conn, %{"id" => id}) do
  # do something
end

I guess I would’ve never even thought about using Atoms for parameters if I wasn’t already used to symbols in Rails:

params[:post][:title]

To solve this “problem”, I’ve been using a custom plug in my Elixir applications for the past few months, that essentially symbolizes (or “atomizes”) all keys in the params map in controllers. After some input from other Elixir developers, and major security improvements, I published it as a package on Hex, called BetterParams, allowing you to do this:

def create(conn, %{id: id, post: %{title: title, body: body}}) do
  # or this: params[:post][:title]
end

Implementation uses String.to_existing_atom to prevent against Erlang atom table DoS attacks, and keeps the existing String keys so you can continue to use them if you want.

Check out the project on Github.