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 phoenix未定义功能变更集/3_Elixir_Phoenix Framework - Fatal编程技术网

Elixir phoenix未定义功能变更集/3

Elixir phoenix未定义功能变更集/3,elixir,phoenix-framework,Elixir,Phoenix Framework,我研究菲尼克斯的框架。 是将存储在云存储中的图像的模型。创建图像时,我计算文件的哈希值,并将其作为:name。我制作了一个模型、控制器和视图。但我不明白为什么我会收到一个错误: == Compilation error on file web/models/image.ex == ** (CompileError) web/models/image.ex:26: undefined function changeset/3 (stdlib) lists.erl:1338: :lists.

我研究菲尼克斯的框架。 是将存储在云存储中的图像的模型。创建图像时,我计算文件的哈希值,并将其作为:name。我制作了一个模型、控制器和视图。但我不明白为什么我会收到一个错误:

== Compilation error on file web/models/image.ex ==
** (CompileError) web/models/image.ex:26: undefined function changeset/3
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (elixir) lib/kernel/parallel_compiler.ex:116: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
我已经查看了您的所有代码,但没有找到使用三个参数调用Image.changeset的位置。 My image.ex:

defmodule Blog.Image do
  use Blog.Web, :model

  schema "images" do
    field :name, :string
    field :original_name, :string
    field :filename, :string, virtual: true

    timestamps
  end

  @required_fields ~w(
    name
    original_name
    filename
  )
  @optional_fields ~w()

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, @required_fields, @optional_fields)
  end

  def create_changeset(struct, params \\ %{}) do
    struct
    |> changeset(struct, params)
    |> generate_name_hash
  end

  defp generate_name_hash(changeset) do
    put_change(changeset, :name, gen_hash_name(changeset[:filename]))
  end

  defp gen_hash_name(filename) do
    hash_name = :crypto.hash(:sha256, File.read(filename))
    |> Base.encode16
    "/"<>slice(hash_name, 0, 2)<>"/"<>slice(hash_name, 2, 2)<>"/"<>slice(hash_name, 4, 2)
  end

end
my new.html.eex:

<%= form_for @changeset, image_path(@conn, :create), [role: "form", multipart: true], fn f -> %>
  <div class="form-group">
    <%= label f, :image, class: "control-label" %>
    <%= file_input f, :image, class: "form-control" %>
    <%= error_tag f, :image %>
  </div>
  <div class="container">
    <div class="form-group">
      <%= submit "Submit", class: "btn btn-default" %>
    </div>
  </div>
<% end %>
%>
我相信:

 def create_changeset(struct, params \\ %{}) do
    struct
    |> changeset(struct, params)
    |> generate_name_hash
  end
应该是

 def create_changeset(struct, params \\ %{}) do
    struct
    |> changeset(params)
    |> generate_name_hash
  end

因为
|>
运算符将它左边的任何内容作为第一个参数传递给右边的函数。因此,您基本上是在执行
变更集(struct,struct,params)

堆栈跟踪会准确地告诉您错误所在:
**(CompileError)web/models/image.ex:26:undefined function changeset/3

我相信您正在尝试使用
cast
函数,因为
changeset
函数在中本机不存在。另外,
cast
的arity为3,因此缺少一个参数

在第26行更改此选项:

def create_changeset(struct, params \\ %{}) do
  struct
  |> changeset(struct, params)
  |> generate_name_hash
end
为此:

def create_changeset(struct, params \\ %{}) do
  struct
  |> cast(params, [:name, :original_name, :filename])   #<---- 3rd arg. = 'allowed'
  |> generate_name_hash
end
def create_变更集(struct,params\\%{})do
结构
|>强制转换(参数,[:名称,:原始名称,:文件名])\
结束
其中
cast
函数需要三个参数
cast(数据、参数、允许)
。忽略所有不明确允许的参数

正如Mchl所说,函数的结果被传递到管道操作中的下一个函数的第一个参数(在本文中,您不需要显式地传递
struct

def create_changeset(struct, params \\ %{}) do
  struct
  |> cast(params, [:name, :original_name, :filename])   #<---- 3rd arg. = 'allowed'
  |> generate_name_hash
end