Elixir 未为元组类型的{:ok、[“Massimo Dutti”、“Sneakers laag”、“38”、“Black”、“99.95”实现协议枚举

Elixir 未为元组类型的{:ok、[“Massimo Dutti”、“Sneakers laag”、“38”、“Black”、“99.95”实现协议枚举,elixir,protocols,phoenix-framework,enumerable,Elixir,Protocols,Phoenix Framework,Enumerable,对于一个学校项目,我们必须用elixir制作一个网络商店,通过上传一个csv文件来创建新产品。我们试图通过以下方式实现这一点,但总是出现错误(请参阅标题) 有人能帮我们吗?这是我们的代码: 表格 <%= form_for @changeset, @action, [multipart: true], fn f -> %> <div class="form-group"> <label>File</label>

对于一个学校项目,我们必须用elixir制作一个网络商店,通过上传一个csv文件来创建新产品。我们试图通过以下方式实现这一点,但总是出现错误(请参阅标题)
有人能帮我们吗?这是我们的代码:
表格

<%= form_for @changeset, @action, [multipart: true], fn f -> %>
 <div class="form-group">
  <label>File</label>
  <%= file_input f, :file, class: "form-control" %>
 </div>

 <div class="form-group">
  <%= submit "Submit", class: "btn btn-primary" %>
 </div>
<% end %>
模式

schema "products" do
 field :color, :string
 field :size, :string
 field :description, :string
 field :price, :decimal
 field :title, :string

 timestamps()
end

@doc false
def changeset(product, attrs) do
product
 |> cast(attrs, [:title, :description, :size, :color, :price, :stock])
 |> validate_required([:title, :description, :size, :color, :price, :stock])
 |> unique_constraint(:title, name: :unique_products_index, message:
 "Title already in use.")
end
控制器

<%= render "bulkform.html", changeset: @changeset, action: Routes.product_path(@conn, :createBulk) %>
def createBulk(conn, %{"product" => product_params}) do
 product_params["file"].path
 |> File.stream!()
 |> CSV.decode
 |> Enum.each(fn(product) -> Product.changeset(%Product{}, %{title: Enum.at(product, 0), description: 
 Enum.at(product, 1), size: Enum.at(product, 2), color: Enum.at(product, 3), price: Enum.at(product, 4)})
 |> Repo.insert() end)
 conn
 |> put_flash(:info, "Imported")
 |> redirect(to: Routes.product_path(conn, :overview))
end

如果您完整地包含了错误消息,并且能够准确地向我们显示错误消息中提到的行,这将更有帮助

然而,正如Aleksei已经指出的那样,我怀疑您的问题在于,您应该在传递列表时,将一个元组传递给
Enum.each/1
。换言之:

Enum.each({:ok, [1, 2, 3]}, fn x -> IO.puts(x) end)
** (Protocol.UndefinedError) protocol Enumerable not implemented for ...
鉴于此方法效果良好:

Enum.each([1, 2, 3], fn x -> IO.puts(x) end)

因此,
CSV.decode
的输出不能通过管道直接传输到
Enum
函数,因为它返回元组,但使用的是
CSV.decode应该返回原始列表,您的代码应该可以工作。

CSV.decode
→ <代码>CSV.decode。前者返回一个元组
{:好的,结果}
。就是这样:)谢谢!CSV.decode!修好了,谢谢!
Enum.each([1, 2, 3], fn x -> IO.puts(x) end)