On p. 25 in "Programming Phoenix 1.4 (ebook, beta)", there is an aside by Chris McCord that says:
In the world action in our controllers, the external parameters have string keys, "name" => name, while internally we use name: name. That’s a convention followed throughout Phoenix. External data can’t safely be converted to atoms, because the atom table isn’t garbage-collected. Instead, we explicitly match on the string keys, and then our application boundaries like controllers and channels will convert them into atom keys, which we’ll rely on everywhere else inside Phoenix.
Paraphrasing, the quote says:
External data can’t safely be converted to atoms...so you convert string keys to atom keys...
Huh? I think what he is trying to say is that if somebody sends you some json data with 100 million (string) keys, and you blindly convert the whole json to an elixir map with atom keys, then you will be in danger of overflowing the atom table. On the other hand, if you use pattern matching to pick out the key/values that your are interested in from the json data, then insert them into an elixir map with atom keys, then you will obviously create fewer atoms in the atom table.