Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 代码生成与预期不同_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir 代码生成与预期不同

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模块

我正在按照《凤凰城编程》(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
而在本书中,
变更集
函数如下所示:

@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能尽快发布这本书的更新版本。