【问题标题】:Creating gender dropdown in Phoenix / Elixir results in "assign @all_genders not available in eex template."在 Phoenix / Elixir 中创建性别下拉列表会导致“分配 @all_genders 在 eex 模板中不可用”。
【发布时间】:2020-09-19 10:38:14
【问题描述】:

我想将性别添加到来自数据库(和其他查找表)的客户端

我已经这样定义了客户端:

defmodule Dropdown.Clients.Client do
  use Ecto.Schema
  import Ecto.Changeset
  alias Dropdown.Clients.Admin

  schema "clients" do
    field :email, :string
    field :name, :string

    belongs_to :genders, Admin

和性别

defmodule Dropdown.Clients.Admin do
  use Ecto.Schema
  import Ecto.Changeset

  schema "gender" do
    field :gender, :string
    has_many :clients, Client
  end

控制器添加和创建函数如下:

  def new(conn, _params) do
    changeset = Clients.change_client(%Client{})
    gender_query = from g in Admin, select: {g.gender, g.id}
    all_genders = Dropdown.Repo.all(gender_query)

    render(conn, "new.html", all_genders: all_genders, changeset: changeset)
  end

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

    case Clients.create_client(client_params) do
      {:ok, client} ->
        conn
        |> put_flash(:info, "Client created successfully.")
        |> redirect(to: Routes.client_path(conn, :show, client))

      {:error, %Ecto.Changeset{} = changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
  end

对应的上下文为:

    Client
    |> Repo.get!(id)
    |> Repo.preload(:genders)
  end

  def create_client(attrs \\ %{}) do
    %Client{}
    |> IO.inspect()
    |> Client.changeset(attrs)
    |> Repo.insert()
  end

在添加表单中:

  <%= select(f, :gender_id, @all_genders) %>
  <%= error_tag f, :gender_id %>

我让表单显示性别下拉菜单,但是,当我提交时出现错误:

分配 @all_genders 在 eex 模板中不可用。

IO.inspect 显示:

  [debug] Processing with DropdownWeb.ClientController.create/2
  Parameters: %{"_csrf_token" => "ECAXCnJJEw1ZGRtyFmoZDDF_GjQ3CHFzqvxrAypk0JW5N3kkE1UytpBJ", "client" => %{"email" => "george@example.com", "gender_id" => "1", "name" => "George Company"}}
  Pipelines: [:browser]

任何有关解决此问题的建议将不胜感激。

【问题讨论】:

  • {:error, %Ecto.Changeset{} = changeset} -&gt; render(conn, "new.html", changeset: changeset)。您缺少 all_genders 分配

标签: elixir html-select phoenix-framework


【解决方案1】:

在您的错误情况下(当Client.create_client/1 返回错误元组时,您将再次呈现new.html 模板。但是,您没有提供all_genders 分配(键:值),因此当它尝试呈现时,它崩溃了。

您必须修改控制器以在错误情况下也包含all_genders

def new(conn, _params) do
  changeset = Clients.change_client(%Client{})
  gender_query = from g in Admin, select: {g.gender, g.id}
  all_genders = Dropdown.Repo.all(gender_query)

  render(conn, "new.html", all_genders: all_genders, changeset: changeset)
end

def create(conn, %{"client" => client_params}) do
  case Clients.create_client(client_params) do
    {:ok, client} ->
      conn
      |> put_flash(:info, "Client created successfully.")
      |> redirect(to: Routes.client_path(conn, :show, client))

    {:error, %Ecto.Changeset{} = changeset} ->
      # This part was missing in your original code
      gender_query = from g in Admin, select: {g.gender, g.id}
      all_genders = Dropdown.Repo.all(gender_query)
      # -----------
      render(conn, "new.html", changeset: changeset, all_genders: all_genders)
  end
end

【讨论】:

  • 谢谢。那行得通。现在需要弄清楚为什么会出现错误而不是保存记录。
【解决方案2】:

错误是变更集中的错字。这是完整的客户端上下文

defmodule Dropdown.Clients.Client do
  use Ecto.Schema
  import Ecto.Changeset
  alias Dropdown.Clients.Admin

  schema "clients" do
    field :email, :string
    field :name, :string

    belongs_to :genders, Admin

    timestamps()
  end

  @doc false
  def changeset(client, attrs) do
    client
    |> cast(attrs, [:name, :email, :genders_id])
    |> validate_required([:name, :email, :genders_id])
  end
end

为了完整性,管理员也是如此

defmodule Dropdown.Clients.Admin do
  use Ecto.Schema
  import Ecto.Changeset

  schema "gender" do
    field :gender, :string

    timestamps()
  end

  @doc false
  def changeset(admin, attrs) do
    admin
    |> cast(attrs, [:gender])
    |> validate_required([:gender])
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多