在 Phoenix / Elixir 中创建性别下拉菜单导致 "assign @all_genders not available in eex template."
Creating gender dropdown in Phoenix / Elixir results in "assign @all_genders not available in eex template."
我想将性别添加到来自数据库(和其他查找表)的客户端
我是这样定义客户端的:
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
对应的Context为:
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]
如有任何解决此问题的建议,我们将不胜感激。
在您的错误情况下(当 Client.create_client/1
returns 一个错误元组时,您将再次呈现 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
错误是变更集中的拼写错误。这是完整的客户端上下文
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
我想将性别添加到来自数据库(和其他查找表)的客户端
我是这样定义客户端的:
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
对应的Context为:
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]
如有任何解决此问题的建议,我们将不胜感激。
在您的错误情况下(当 Client.create_client/1
returns 一个错误元组时,您将再次呈现 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
错误是变更集中的拼写错误。这是完整的客户端上下文
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