【发布时间】:2017-10-09 00:53:00
【问题描述】:
我有一个 csv 文件,其中包含用户列表和 UserController 中的以下导入方法,我想通过提交带有表单的 csv 文件来导入这些用户。看起来我做错了。
users_controller
def import(conn, %{"user" => user_params}) do
user_params["file"]
|> File.stream!()
|> CSV.decode
|> Enum.each(fn(user) -> User.changeset(%User{}, %{name: Enum.at(user, 0), email: Enum.at(user, 1)}) |> Repo.insert end)
conn
|> put_flash(:info, "Imported")
|> redirect(to: user_path(conn, :index))
end
路线
post "/import", UsersController, :import, as: :import_csv
表格
<%= render "import_form.html", changeset: @changeset,
action: import_csv_path(@conn, :import) %>
-
<%= form_for @changeset, @action, [multipart: true], fn f -> %>
<div class="form-group">
<%= label f, :file, class: "control-label" %>
<%= file_input f, :file %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>
型号
schema "users" do
field :name, :string
field :email, :string
field :file, :any, virtual: true
timestamps()
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:name, :email, :file])
|> validate_required([:name, :email])
|> unique_constraint(:email)
end
以下代码适用于 iex
def import(file) do
file
|> File.stream!()
|> CSV.decode
|> Enum.each(fn(user) -> User.changeset(%User{}, %{name: Enum.at(user, 0), email: Enum.at(user, 1)}) |> Repo.insert end)
end
【问题讨论】:
-
您是否遇到任何错误?
-
我收到了
no function clause matching in IO.chardata_to_string/1,但下面的答案解决了这个问题。我需要选择path。 ty