代码生成与预期不同

时间:2016-08-24 09:45:26

标签: 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模块。我最终得到的代码是:

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)

(请原谅后一段中的拼写错误;我必须手工输入)

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

1 个答案:

答案 0 :(得分:5)

是的,这是版本差异。 Phoenix 1.2转而使用Ecto 2.0,该版本弃用了Ecto.Changeset.cast的4个版本,支持3个版本+对Ecto.Changeset.validate_required/3的调用。 Ecto 2.0也将:empty传递给cast。所有这些以及更多更改都记录在the changelog

  

亮点

     

修改后的变更集

     

由于反馈,我们对变更集进行了三项重要更改:

     
      
  1. changeset.model已重命名为changeset.data(我们不再拥有"型号"在Ecto中)
  2.   
  3. 不推荐将所需字段和可选字段移至cast/4,以支持cast/3validate_required/3
  4.   
  5. 我们已弃用:empty中的cast(source, :empty, required, optional)个原子,请使用空地图或:invalid代替
  6.         

    总结这些变化,而不是:

    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
    
         

    ...