Elixir 代码生成与预期不同
我正在按照《凤凰城编程》(Programming Phoenix)一书构建给定的Rumbl应用程序。我的问题与我们使用生成器自动创建许多功能的章节有关。使用的命令是:Elixir 代码生成与预期不同,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我正在按照《凤凰城编程》(Programming Phoenix)一书构建给定的Rumbl应用程序。我的问题与我们使用生成器自动创建许多功能的章节有关。使用的命令是: $ mix phoenix.gen.html Video videos user_id:references:users url:string title:string description:text 现在的问题是,在一些地方,书中给出的代码和我得到的代码之间存在差异。一个很好的例子是web/models/video.ex模块
$ 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
而在本书中,变更集
函数如下所示:
@required_fields ~w(url title description)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
(请原谅后一段中的打字错误;我必须手工打字)
我不明白为什么会有这种差异。可能是因为版本不同吗?更重要的是,这种差异意味着什么?是的,这是一种版本差异。Phoenix 1.2改用了Ecto 2.0,它不推荐使用4个数的
Ecto.Changeset.cast
版本,而支持3个数的1+a调用Ecto.Changeset.validate\u required/3
。Ecto 2.0还取消了传递<代码>:空的<代码>到<代码>投射<代码>。所有这些以及其他一些更改都记录在:
集锦
改进的变更集
由于反馈,我们对变更集进行了三项重要更改:
changeset.model
已重命名为changeset.data
(我们在Ecto中不再有“models”)cast/4
不受欢迎,而支持cast/3
和validate\u required/3
强制转换中的:empty
原子(源代码:empty,必需,可选)
已被弃用,请使用空映射或: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
是的,这是版本差异。Phoenix 1.2改用了Ecto 2.0,它不推荐使用4个数的
Ecto.Changeset.cast
版本,而支持3个数的1+a调用Ecto.Changeset.validate\u required/3
。Ecto 2.0还取消了传递<代码>:空的<代码>到<代码>投射<代码>。所有这些以及其他一些更改都记录在:
集锦
改进的变更集
由于反馈,我们对变更集进行了三项重要更改:
changeset.model
已重命名为changeset.data
(我们在Ecto中不再有“models”)cast/4
不受欢迎,而支持cast/3
和validate\u required/3
强制转换中的:empty
原子(源代码:empty,必需,可选)
已被弃用,请使用空映射或: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
再次感谢你,好先生!我可以说这些版本差异非常令人讨厌吗?:-)是的,当你只是学习东西的时候,肯定很烦人。我希望PragProg能尽快发布这本书的更新版本。再次感谢您,好先生!我可以说这些版本差异非常令人讨厌吗?:-)是的,当你只是学习东西的时候,肯定很烦人。我希望PragProg能尽快发布这本书的更新版本。