代码生成与预期不同

ank*_*981 1 elixir ecto phoenix-framework

我正在按照这Programming Phoenix本书来构建给定的Rumbl应用程序.我的问题与我们使用生成器自动创建大量功能的章节有关.使用的命令是:

$ mix phoenix.gen.html Video videos user_id:references:users url:string title:string description:text
Run Code Online (Sandbox Code Playgroud)

现在的问题是,在几个地方,书中给出的代码和我得到的代码之间存在差异.一个很好的例子是web/models/video.ex模块.我最终得到的代码是:

defmodule Rumbl.Video do
  use Rumbl.Web, :model

  schema "videos" do
    field :url, :string
    field :title, :string
    field :description, :string
    belongs_to :user, Rumbl.User

    timestamps()
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:url, :title, :description])
    |> validate_required([:url, :title, :description])
  end
end
Run Code Online (Sandbox Code Playgroud)

而在书中,changeset功能如下:

@required_fields ~w(url title description)
@optional_fields ~w()

def changeset(model, params \\ :empty) do
  model
  |> cast(params, @required_fields, @optional_fields)
Run Code Online (Sandbox Code Playgroud)

(请原谅后一个片段中的拼写错误;我必须手工输入)

我不明白为什么会出现这种差异.可能是因为版本差异?更重要的是,这种差异意味着什么?

Dog*_*ert 5

是的,这是版本差异.凤凰城1.2转而使用Ecto 2.0,该版本弃用了4 arity版本,Ecto.Changeset.cast支持3 arity one + a call Ecto.Changeset.validate_required/3.外生2.0还depracated传递:emptycast.更改日志中记录了所有这些以及更多更改:

强调

改进后的变更集

由于反馈,我们对变更集做出了三项重要更改:

  1. changeset.model已重命名为changeset.data(我们在Ecto中不再有"模型")
  2. 将所需和可选字段传递给cast/4不推荐使用cast/3validate_required/3
  3. :empty在原子cast(source, :empty, required, optional)已被弃用,请使用空地图或:invalid代替

总结这些变化,而不是:

def changeset(user, params \\ :empty) do
  user
  |> cast(params, [:name], [:age])
end
Run Code Online (Sandbox Code Playgroud)

应该写:

def changeset(user, params \\ %{}) do
  user
  |> cast(params, [:name, :age])
  |> validate_required([:name])
end
Run Code Online (Sandbox Code Playgroud)

...