Well - unexpected to me, though part of the language.

I've been putting something together in Phoenix, and one of the pages kept throwing an error that it couldn't find item_path/3. This was odd, as the generating code in the template had four arguments.

Same happened when I broke it into IEx to poke at it:

iex(1)> Routes.page_path(conn, :index, user_id: user.id, item_id: item.id)
** (UndefinedFunctionError) function AppWeb.Router.Helpers.item_path/3 is undefined or private. Did you mean one of:

  * item_path/4
  * item_path/5

People familiar with Elixir can already spot the problem I imagine...

In Elixir, key: value, key: value forms what's known as a keyword list. What I hadn't expected was that the language would automatically convert those last two arguments into a keyword list. Apparently it did:

iex(2)> i one: 1, two: 2
Term
  [one: 1, two: 2]
Data type
  List

Remove the keywords and everything works fine.

iex(3)> Routes.item_path(conn, :index, user.id, item.id)
"/users/1/item/2"

Until the next bug at least. :-) Too much time recently writing JavaScript and reviewing Python I think!