2016-08-24 16 views
1

私はProgramming PhoenixのRumblアプリケーションを構築するための本を読んでいます。私の問題は、ジェネレータを使って多くの機能を自動的に作成する章と関係があります。使用するコマンドは:コード生成が予想外です

$ mix phoenix.gen.html Video videos user_id:references:users url:string title:string description:text 

問題は今ではいくつかの場所では、本の中で与えられたコードと私は取得していますとの違いがあることです。 1つの良い例は、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.validate_required/3への呼び出しのために、Ecto.Changeset.castの4つのバージョンを推奨しませんでした。 Ecto 2.0はまた、:emptycastに渡すことを失った。このすべてをし、いくつかのより多くの変更がthe changelogに記載されています:

ハイライト

刷新チェンジ

ため、フィードバックには、我々はチェンジに三つの重要な変更を加えています

  1. changeset.modelはされていますchangeset.dataに改名されました(Ectoには "モデル"はありません)
  2. 合格equiredとオプションのフィールドcast/4からcast(source, :empty, required, optional):empty原子が廃止されましたcast/3validate_required/3
  3. の賛成で廃止され、それらの変更をまとめるのではなく、代わりに

を空のマップや: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

関連する問題