我正在按照Programming Phoenix
书来构建给定的Rumbl应用程序。我的问题与我们使用生成器自动创建大量功能的章节有关。使用的命令是:
$ mix phoenix.gen.html Video videos user_id:references:users url:string title:string description:text
现在的问题是,在几个地方,书中给出的代码和我得到的代码之间存在差异。一个很好的例子是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
然而在书中,changeset
函数给出为:
@required_fields ~w(url title description)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
(请原谅后一段中的拼写错误;我必须手工输入)
我不明白为什么会出现这种差异。可能是因为版本差异?更重要的是,这种差异意味着什么?
答案 0 :(得分:5)
是的,这是版本差异。 Phoenix 1.2转而使用Ecto 2.0,该版本弃用了Ecto.Changeset.cast
的4个版本,支持3个版本+对Ecto.Changeset.validate_required/3
的调用。 Ecto 2.0也将:empty
传递给cast
。所有这些以及更多更改都记录在the changelog:
亮点
修改后的变更集
由于反馈,我们对变更集进行了三项重要更改:
changeset.model
已重命名为changeset.data
(我们不再拥有"型号"在Ecto中)- 不推荐将所需字段和可选字段移至
cast/4
,以支持cast/3
和validate_required/3
- 我们已弃用
醇>:empty
中的cast(source, :empty, required, optional)
个原子,请使用空地图或:invalid
代替总结这些变化,而不是:
def changeset(user, params \\ :empty) do user |> cast(params, [:name], [:age]) end
应该写一下:
def changeset(user, params \\ %{}) do user |> cast(params, [:name, :age]) |> validate_required([:name]) end
...