如何确保变更集可以模式匹配Ecto Repo.Insert / 1的私有函数?

时间:2016-01-04 14:00:10

标签: elixir phoenix-framework ecto

我第一次使用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

谢谢!

1 个答案:

答案 0 :(得分:1)

这里的问题可能是defstruct [:id, :title, :date, :content, :active]行。您将使用自己的。{/ p>重写schema宏生成的结构

删除它,您的代码应该有效。