Ошибка при создании формы феникса и ее отправке - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в фениксе и эликсире.Пытаясь создать форму для отправки 1 предложения в базу данных, и я получаю сообщение об ошибке, когда нажмите кнопку отправить форму.Btw.Я следую некоторому курсу, и я очень запутался.Есть коды Opa_Controller.ex

 defmodule Test.OpaController do
   use Test.Web, :controller
     alias Test.Opa

    def new(conn,_params) do
     struct = %Test.Opa{}
     params = %{}
     changeset = Test.Opa.changeset(struct,params)
     render conn, "sex.html", changeset: changeset
   end
   def create(conn,%{"naziv" => naziv}) do

     changeset = Opa.changeset(%Opa{}, naziv)
    case Repo.insert(changeset) do
      {:ok, post} -> IO.inspect(post)
       {:error, changeset} -> IO.inspect(changeset)
   end
   end
 end

Test.ex

 defmodule Test.Opa do
   use Test.Web, :model

   schema "opala" do
     field :naziv, :string
   end

   def changeset(struct, params \\ %{}) do
     struct
     |> cast(params, [:naziv])
     |> validate_required ([:naziv])
   end
 end

HTML-файл

 <%= form_for @changeset, opa_path(@conn, :create), fn f -> %>
     <%= text_input f, :naziv, placeholder: "naziv" %>
     <%= submit "Save Topic" %>
 <% end %>

Router.ex

     get "/", PageController, :index
     get "/opa/new", OpaController, :new
     get "/hello", HelloController, :index
     post "/opa", OpaController, :create

В терминале я получаю

     [debug] ** (Phoenix.ActionClauseError) could not find a matching      Test.OpaController.create clause
     to process request. This typically happens when there is a
     parameter mismatch but may also happen when any of the other
     action arguments do not match. The request parameters are:

       %{"_csrf_token" => "BDgWfgElRhRdSgoFBTo0BF4+P1YXNgAAtANQOf4Fi+GIlpej+Mt1eg==", "_utf8" => "✓", "opa" => %{"naziv" => "sa"}}

В браузере: https://pastebin.com/A2Z3466D

1 Ответ

0 голосов
/ 07 февраля 2019

Действие создания ожидает ключ карты верхнего уровня "naziv", видимый по определению функции:

def create(conn,%{"naziv" => naziv}) do

Параметры, отправляемые в действие контроллера - как видно из сообщения об ошибке -- are:

%{
  "_csrf_token" => "BDgWfgElRhRdSgoFBTo0BF4+P1YXNgAAtANQOf4Fi+GIlpej+Mt1eg==",
  "_utf8" => "✓",
  "opa" => %{"naziv" => "sa"}
}

Как мы видим, "naziv" вложено под ключ "opa" верхнего уровня.

То, что мы на самом деле хотим пройти, это изменитьсопоставление с образцом в функции создания, так что она ожидает ключ "opa" верхнего уровня:

    def create(conn,%{"opa" => opa_params}) do
      changeset = Opa.changeset(%Opa{}, opa_params)
      case Repo.insert(changeset) do
        {:ok, post} -> IO.inspect(post)
        {:error, changeset} -> IO.inspect(changeset)
      end
    end
...