2016-08-24 39 views
1

我正在关注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) 

(请原谅在后段错别字,我不得不手动键入)

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

回答

5

是的,这是一个版本差异。 Phoenix 1.2切换到使用Ecto 2.0,该版本弃用了Ecto.Changeset.cast的四个版本,转而选择了3个版本+致电Ecto.Changeset.validate_required/3。 Ecto 2.0也表示将:empty传递给cast。所有这一切以及更多的变化都记录在the changelog

亮点

翻新的变更

由于反馈,我们已经进行了三次重要变化的变更:

  1. changeset.model一直改名为changeset.data(我们在Ecto中不再有“型号”)
  2. 传递r equired和可选字段cast/4赞成cast/3被弃用,validate_required/3
  3. cast(source, :empty, required, optional):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 

...

+0

再次感谢你,好先生!我可以说这些版本差异*非常*烦人? :-) – dotslash

+0

是的,当你只是学习东西时,肯定非常讨厌。我希望PragProg尽快发布本书的更新版本。 – Dogbert