【发布时间】:2017-04-24 16:46:24
【问题描述】:
我在 Phoenix 创建了一个简单的“Thing”ecto 模型。 “图像”是一个字符串,它引用了上传的文件。当上传的图像到达控制器时,我想将图像结构转换为字符串(为了这个示例,我们将其保存为“foo123”)
#/web/models/thing.ex
defmodule MyApp.Thing do
use MyApp.Web, :model
schema "comics" do
field :number, :integer
field :image, :string
timestamps()
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:number, :image])
|> validate_required([:number, :image])
end
end
#/web/controllers/thing_controller.ex
def create(conn, %{"thing" => thing_params}) do
IO.inspect thing_params
changeset = Thing.changeset(%Thing{}, thing_params)
|> change("image", "foo123") ### something like this
case Repo.insert!(changeset) do
{:ok, _thing} ->
conn
|> put_flash(:info, "Thing created successfully.")
|> redirect(to: thing_path(conn, :index))
{:error, changeset} ->
conn
|> put_flash(:error, "Something went wrong")
|> redirect(to: thing_path(conn, :index))
end
end
这不起作用,我仍然需要将%{"image" => %Plug.Upload{content_type: "image/jpeg",... 转换为“foo123”,但这是在哪里发生的呢?在变更集分配中?在def create()的参数中?
另外,我怎样才能IO.inspect 只是 param 结构的某个成员? (比如IO.inspect thing_params.image?
【问题讨论】:
-
最后一个问题可以
IO.inspect thing_params["image"]。.image不起作用,因为键是字符串,而不是原子。 -
对于主要问题,您可以使用
|> put_change(:image, "foo123"),但这不会重新运行Thing.changeset/2的验证。我不确定手动处理文件上传的最佳方式是什么,所以我只是在这里发表评论而不是发布答案。 -
@Dogbert 这实际上是我正在寻找的答案。 put_change() 去哪儿了?当我运行
changeset = Thing.changeset(%Thing{}, thing_params) |> put_change(:image, "foo123")时,我得到** (CompileError) web/controllers/thing_controller.ex:19: undefined function put_change/3。这是放错地方了吗,还是我忘记在控制器中导入一些东西? -
@Dogbert:这正是我想要的,谢谢。如果您想发布此内容,我会将其标记为正确。 ` changeset = Thing.changeset(%Comic{}, comic_params) |> Ecto.Changeset.put_change(:image, "foo123")`
标签: parameters elixir phoenix-framework ecto changeset