Well - unexpected to me at the time, 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 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...
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"