我第一次使用Ecto制作凤凰博客,并且遇到了Repo.insert / 1的问题。我得到的具体错误是:
no function clause matching in Ecto.Repo.Schema.metadata/1
我一直在玩IEx.pry并看到我传递给Repo.Insert的变更集是有效的(有效:true),并包含我想要的更改(更改:%{content:“bar”,title :“foo”})。但是,我看到Repo.Schema.metadata / 1需要上下文和来源,我不确定Repo.insert或Repo.do_insert是否能够获得&加上那个。我也不知道如何检查Ecto私有函数中的变量状态。
我的控制器代码:
def create(conn, %{"post" => post_params}) do
changeset = Post.changeset(%Post{}, post_params)
case Repo.insert(changeset) do #this line blows up
{:ok, post} ->
我的型号代码:
defstruct [:id, :title, :date, :content, :active]
schema "posts" do
field :title, :string
field :date, Ecto.DateTime
field :content, :string #is text in migration
field :active, :boolean, default: false
timestamps
end
@required_fields ~w(title content)
@optional_fields ~w(date)
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
谢谢!
答案 0 :(得分:1)
这里的问题可能是defstruct [:id, :title, :date, :content, :active]
行。您将使用自己的。{/ p>重写schema
宏生成的结构
删除它,您的代码应该有效。