У меня есть функция, которая делает "contacts.csv" следующим образом.
def write(people) do
[["name", "phone_number"]]
|> Stream.concat(people |> Stream.map(&[&1.name, Formatter.remove_international_code(&1.phone_number)]))
|> CSV.encode()
|> Enum.into(File.stream!("contacts.csv"))
end
, и я хочу, чтобы мой клиент нажимал кнопку, чтобы загрузить этот файл.Поэтому я сделал это следующим образом ..
В router.ex
get "/csv/:id", CsvExportController, :export
В файле контроллера
def export(conn, %{"id" => phonebook_id}) do
conn
|> put_resp_content_type("text/csv")
|> put_resp_header("content-disposition", "attachment; filename=\"contacts.csv\"")
|> send_resp(200, export_contacts_from_phonebook(phonebook_id))
end
def export_contacts_from_phonebook(phonebook_id) do
Contact.get_people(phonebook_id)
|> CsvFormatter.write()
end
в CsvFormatter.ex
def write(people) do
[["name", "phone_number"]]
|> Stream.concat(people |> Stream.map(&[&1.name, Formatter.remove_international_code(&1.phone_number)]))
|> CSV.encode()
|> Enum.sort()
|> Enum.into(File.stream!("contacts.csv"))
end
и попытался, но получил ошибку
no function clause matching in Plug.Conn.resp/3
как я могу сделать это в файле контроллера?