gpt4 book ai didi

elixir - 如何在Phoenix框架中处理关联和嵌套形式?

转载 作者:行者123 更新时间:2023-12-03 12:16:30 29 4
gpt4 key购买 nike

在Phoenix框架中处理关联和嵌套表单的方式是什么?如何创建具有嵌套属性的表单?一个人将如何在 Controller 和模型中处理它?

最佳答案

有一个处理1-1情况的简单示例。

假设我们有一个CarEngine模型,显然还有一个Car has_one Engine。所以有汽车模型的代码

defmodule MyApp.Car do
use MyApp.Web, :model

schema "cars" do
field :name, :string

has_one :engine, MyApp.Engine

timestamps
end

def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(name), ~w())
|> validate_length(:name, min: 5, message: "No way it's that short")
end

end

和引擎模型
defmodule MyApp.Engine do
use MyApp.Web, :model

schema "engines" do
field :type, :string

belongs_to :car, MyApp.Car

timestamps
end

def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(type), ~w())
|> validate_length(:type, max: 10, message: "No way it's that long")
end

end

表单的简单模板->
<%= form_for @changeset, cars_path(@conn, :create), fn c -> %>

<%= text_input c, :name %>

<%= inputs_for c, :engine, fn e -> %>

<%= text_input e, :type %>

<% end %>

<button name="button" type="submit">Create</button>

<% end %>

和 Controller ->
defmodule MyApp.CarController do
use MyApp.Web, :controller
alias MyApp.Car
alias MyApp.Engine

plug :scrub_params, "car" when action in [:create]

def new(conn, _params) do
changeset = Car.changeset(%Car{engine: %Engine{}})
render conn, "new.html", changeset: changeset
end

def create(conn, %{"car" => car_params}) do
engine_changeset = Engine.changeset(%Engine{}, car_params["engine"])
car_changeset = Car.changeset(%Car{engine: engine_changeset}, car_params)
if car_changeset.valid? do
Repo.transaction fn ->
car = Repo.insert!(car_changeset)
engine = Ecto.Model.build(car, :engine)
Repo.insert!(engine)
end
redirect conn, to: main_page_path(conn, :index)
else
render conn, "new.html", changeset: car_changeset
end
end

end

以及关于该主题的有趣博客文章,它也可以阐明一些内容-> here

关于elixir - 如何在Phoenix框架中处理关联和嵌套形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32054561/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com