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)
(请原谅后一个片段中的拼写错误;我必须手工输入)
我不明白为什么会出现这种差异.可能是因为版本差异?更重要的是,这种差异意味着什么?
是的,这是版本差异.凤凰城1.2转而使用Ecto 2.0,该版本弃用了4 arity版本,Ecto.Changeset.cast支持3 arity one + a call Ecto.Changeset.validate_required/3.外生2.0还depracated传递:empty到cast.更改日志中记录了所有这些以及更多更改:
强调
改进后的变更集
由于反馈,我们对变更集做出了三项重要更改:
changeset.model已重命名为changeset.data(我们在Ecto中不再有"模型")- 将所需和可选字段传递给
cast/4不推荐使用cast/3和validate_required/3- 的
:empty在原子cast(source, :empty, required, optional)已被弃用,请使用空地图或:invalid代替总结这些变化,而不是:
Run Code Online (Sandbox Code Playgroud)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...
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |