У меня есть контроллер, где я хотел бы добавить идентификатор страницы facebook и токен доступа к моей базе данных, чтобы я мог отправлять сообщения от имени пользователя.Phoenix, Does conn redirect остановить всю дальнейшую обработку?
Для этого мне нужно сделать GET-вызов в facebook, а затем с токеном доступа, который мне нужно вставить в мою базу данных.
Это означает, что у меня есть вложенный оператор случай, потому что есть 2 точки ошибок, от facebook вызова и вставлять в репозиторий:
case response_from_facebook do
{:ok, token} ->
case Repo.insert(token) do
{:ok, _} -> ... redirect the user
{:error, _} -> ... show an error message
{:error, _} -> redirect and show an error
Это некрасиво имо поэтому мне было интересно, если я сделал что-то вроде охранник, если он прекратит дальнейшую обработку:
token = case response_from_facebook do
{:ok, token} -> token
{error,_ } -> conn |> redirect(to: user_path(conn, :show, user_id))
end
# Does it ever try to insert into the repo if an error occurs?
Repo.update ... etc.
Это сделает мой код понятнее, чтобы понять/читать, но, я не совсем уверен, что если бы перенаправлять предотвратить попытку вставить в мой репозиторий. Если этот «защитник» не является решением, как я могу предотвратить многопользовательский аргумент case, который может быть затруднен, чтобы читать?
Ответ 'response_from_facebook' возвращает ошибку, которая легко сопоставима с образцом, отдельно от ошибок' Repo.insert' (можете ли вы опубликовать ошибки, которые она может вернуть?)? Если да, вы можете использовать новый макрос 'с' для упрощения этой части кода. – Dogbert
@ Dogbert вы можете дать ответ/пример? Я посмотрел на макрос онлайн, но, похоже, ни один из примеров не показывает, как обрабатывается ошибка. Предполагаете ли вы присвоить результат «с»? Ошибка из facebook находится в форме '{: ok,% {" error "=>% {" message "=> message}}}', тогда как ошибка из ecto имеет форму '{: error, reason}'. поэтому они могут быть сопоставлены с образцом. Однако я не совсем уверен, как это должно произойти. (Должен ли я передать ошибку внутри оператора 'with'? Должен ли я назначить результат оператора' with' для дальнейшей обработки?) –
Посмотрите пример с блоком 'else' внутри' with' здесь: http: // elixir-lang.org/docs/stable/elixir/Kernel.SpecialForms.html#with/1. – Dogbert