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

标签 elixir phoenix-framework ecto

在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/

相关文章:

erlang - 将 C 库暴露给 Elixir/Erlang 更好,还是在 Erlang/Elixir 中实现更好?

ffmpeg - Elixir 长时间运行的后台任务无法完成,有时会崩溃

elixir - 如何在宏创建的方法中创建数组的未绑定(bind)变量部分(方法参数)

json - 编写自定义插件,它可以处理并返回正文中格式错误的 JSON 的正确错误

elixir - 可怕的冗余 Phoenix Controller

Elixir:如何获取 Ecto 查询的当前日期?

elixir - 无法在 Phoenix 使用 Ecto 模型制作 JSONB

javascript - 在 Phoenix 的javascript中使用 Controller 变量

Elixir map 缩小

elixir - 我何时应该生成混合伞与 Phoenix 伞?