2016-08-24 40 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