В чем разница между => и: в карте эликсира? - PullRequest
0 голосов
/ 27 октября 2018

В инфраструктуре Phoenix

def show(conn, %{"id" => id}) do
  json conn, Repo.get(User, id)
end

соответствует отлично, но использование нотации : не соответствует шаблону

def show(conn, %{"id": id}) do
  json conn, Repo.get(User, id)
end

, когда я вызываю следующий код из теста

conn
|> get(user_path(conn, :show, user.id))
|> json_response(200)

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

%{key: value} - это сокращение от Atom клавиш, а не String клавиш. Давайте разберемся с несколькими вещами:

:"a" == "a"
# => false

:"a" == :a
# => true

%{:a => 1} == %{"a": 1}
# => true

Итак, когда вы пишете %{"id": id}, это означает: %{id: id}, что не %{"id" => id}, и поскольку ваша карта параметров не имеет клавиши :id, она не соответствует.


В качестве дополнительного примечания я на самом деле написал Plug для использования ключей атомов в контроллерах Phoenix для обеспечения соответствия параметров коротким и приятным.

0 голосов
/ 27 октября 2018

Когда вы используете : ключ является атомом.Когда вы используете => ключ - это тот тип, который есть на самом деле.%{key: val} на самом деле просто сахар для %{:key => val}.

...