Форма Phoenix LiveView для повышения NoRouteError на POST - PullRequest
1 голос
/ 23 марта 2020

Итак, я пытаюсь создать приложение для просмотра в реальном времени от Phoenix, и я столкнулся с проблемой, когда попытался внедрить его в свой уже существующий проект. Я создал форму, используя форму form_for, которую предоставляет Phoenix. html, и она отправляет запрос на сервер на мой живой сокет. Это не должно произойти, я не думаю, потому что я успешно сделал демо, и это позволило мне публиковать в режиме реального времени Вот ошибка:

[debug] ** (Phoenix.Router.NoRouteError) no route found for POST /test_live/1 (OkayfivePhxWeb.Router)
(okayfive_phx 0.1.0) lib/phoenix/router.ex:330: OkayfivePhxWeb.Router.call/2
(okayfive_phx 0.1.0) lib/okayfive_phx_web/endpoint.ex:1: OkayfivePhxWeb.Endpoint.plug_builder_call/2
(okayfive_phx 0.1.0) lib/plug/debugger.ex:130: OkayfivePhxWeb.Endpoint."call (overridable 3)"/2
(okayfive_phx 0.1.0) lib/okayfive_phx_web/endpoint.ex:1: OkayfivePhxWeb.Endpoint.call/2
(phoenix 1.4.16) lib/phoenix/endpoint/cowboy2_handler.ex:42: Phoenix.Endpoint.Cowboy2Handler.init/4
(cowboy 2.7.0) /mnt/c/Users/oriont/dev/okayfive_phx/deps/cowboy/src/cowboy_handler.erl:41: :cowboy_handler.execute/2
(cowboy 2.7.0) /mnt/c/Users/oriont/dev/okayfive_phx/deps/cowboy/src/cowboy_stream_h.erl:320: :cowboy_stream_h.execute/3
(cowboy 2.7.0) /mnt/c/Users/oriont/dev/okayfive_phx/deps/cowboy/src/cowboy_stream_h.erl:302: :cowboy_stream_h.request_process/3
(stdlib 3.11.2) proc_lib.erl:249: :proc_lib.init_p_do_apply/3

Вот действующий контроллер: (test_live.ex)

defmodule OkayfivePhxWeb.TestLive do
  use Phoenix.LiveView

  alias OkayfivePhx.Quizzes

  def mount(_params, _session, socket) do
    {:ok, assign(socket, count: 0)}
  end

  def handle_params(%{"id" => id}, _url, socket) do
    {:noreply,
     assign(socket, %{
       user: id,
       changeset: Quizzes.change_student_answer(%Quizzes.StudentAnswer{})
     })}
  end

  def render(assigns), do: OkayfivePhxWeb.QuizView.render("test.html", assigns)

  def handle_event("save", %{"user" => _user_params}, socket) do
    IO.inspect("GET SAVED ON")

    {:noreply, socket}
  end
end

Вот тест. html .leex:

<%= f = form_for @changeset, "#", [phx_submit: :save, phx_hook: "SavedForm"] %>

  <%= label f, :answer %>
  <%= text_input f, :answer, phx_debounce: "blur" %>
  <%= error_tag f, :answer %>

  <div>
    <%= submit "Save", phx_disable_with: "Saving..." %>
  </div>
</form>

Поэтому я попытался сделать что-то еще, например, форму, использующую только html и атрибуты:

<form phx-change="validate" phx-submit="save">
  <input type="text" name="user[email]" phx-debounce="blur"/>
  <input type="text" name="user[username]" phx-debounce="2000"/>
  <input type="submit" value="Submit">
</form>

И, к моему удивлению, эта форма не вызовет ошибку отсутствия маршрута. Но он все еще не вызывал функцию handle_event, которую я определил в test_live.ex

Вот мой маршрутизатор:

pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_live_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

scope "/", OkayfivePhxWeb do
    pipe_through :browser
...
    live "/test_live/:id", TestLive
...

  end

Любая помощь приветствуется. Спасибо!

1 Ответ

1 голос
/ 26 марта 2020

Я на самом деле понял это, и теперь я чувствую себя довольно глупо. Причина заключалась в том, что я не использовал макет с рендерингом в режиме liveview, имея в виду следующее:

<%= @inner_content %>

УБЕДИТЕСЬ, ЧТО ЭТО В ВАШЕМ РАСПОЛОЖЕНИИ, И ЧТО РАСПОЛОЖИТСЯ НА САМОМ ДЕЛЕ.

Если нет, ваша форма отправит запрос по почте, а не через веб-сокет.

...