首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyError at /posts键:主题未在:%{/posts:#Ecto.Changeset中找到

KeyError at /posts键:主题未在:%{/posts:#Ecto.Changeset中找到
EN

Stack Overflow用户
提问于 2017-08-08 13:06:25
回答 1查看 957关注 0票数 0

我正在向表单中添加更多字段:

我把它们添加到post.ex中

代码语言:javascript
复制
field :name_of_gallery, :string
field :future_plans_title, :string

将它们添加到stories.ex中的变更集中:

代码语言:javascript
复制
     defp post_changeset(%Post{} = post, attrs \\ %{}) do
      post
      |> cast(attrs, [:title, :body, :user_id, :published, :original_post_id, :topic_id, :plan, :done_so_far_one, :done_so_far_two, :done_so_far_three, :done_so_far_one_title, :done_so_far_two_title, :done_so_far_three_title, :name_of_gallery, :future_plans_title])
      |> cast_attachments(attrs, [:project_pic])
      |> validate_required([:title, :body, :user_id, :topic_id, :plan, :done_so_far_one, :done_so_far_two, :done_so_far_three,  :done_so_far_one_title, :done_so_far_two_title, :done_so_far_three_title, :project_pic, :name_of_gallery, :future_plans_title]) 
  end

创建了两个迁移文件(这里只显示了一个):

代码语言:javascript
复制
defmodule Citybuilder.Repo.Migrations.AddNameOfGalleryToFields do
  use Ecto.Migration

  def change do
  alter table (:stories_posts) do
    add :future_plans_title, :string

  end
end
end 

我跑了:

代码语言:javascript
复制
mix ecto.drop
mix ecto.setup
mix ecto.migrate
mix run priv/repo/seeds.exs

..。不止一次。

当我检查psql时,它们在postgres:

name_of_gallery _~_

*

用户不能再保存表单了。保存用户表单(在此之前有效)返回:

代码语言:javascript
复制
KeyError at POST /posts
key :topics not found in: %{changeset: #Ecto.Changeset<action: :insert, changes: %{body: 

在网上有一个错误:

代码语言:javascript
复制
  <%= select f, :topic_id, topic_select(@conn.assigns.topics), class: "form-control form-control-topic", placeholder: "Select topic." %>

我有一个主题选择菜单,但这从来没有引起问题。

*

以下是整个错误消息(请求):

代码语言:javascript
复制
key :topics not found in: %{changeset: #Ecto.Changeset<action: :insert, changes: %{body: "My Project Summary", done_so_far_one: "Done So Far One Body", done_so_far_one_title: "Done So Far One Title", done_so_far_three: "Random Text to Test Form", done_so_far_three_title: "Random Text to Test Form", done_so_far_two: "Random Text to Test Form", done_so_far_two_title: "Random Text to Test Form", name_of_gallery: "Random Text to Test Form", plan: "My Project Plan", project_pic: %{file_name: "person-woman-park-music (1).jpg", updated_at: #Ecto.DateTime<2017-08-08 13:11:46>}, title: "My Project Title", topic_id: 1, user_id: 2}, errors: [future_plans_title: {"can't be blank", [validation: :required]}], data: #Citybuilder.Stories.Post<>, valid?: false>, layout: {Citybuilder.Web.LayoutView, "app.html"}, user: %Citybuilder.Auths.User{__meta__: #Ecto.Schema.Metadata<:loaded, "auths_users">, admin: false, encrypted_password: "$2b$12$MvDVJo01scAyrrBtnT1dpulbuj9uwDnS2ZezFeUhmzol7mJXRBYa6", id: 2, inserted_at: ~N[2017-08-08 12:20:13.948747], moderator: false, password: nil, password_confirmation: nil, updated_at: ~N[2017-08-08 12:20:13.970885], username: "jarvis"}}

下面是post和新功能的控制器代码:

代码语言:javascript
复制
def new(conn, _params) do
    default_topic = Stories.get_topic!(@default_topic)
    changeset = Stories.change_post(
      %Citybuilder.Stories.Post{},
      %{topic_id: default_topic.id}
    )
    render(conn, "new.html", changeset: changeset)
  end

  def create(conn, %{"post" => post_params}) do
    case Stories.create_post(post_params, conn.assigns.user) do
      {:ok, post} ->
        conn
        # |> put_flash(:info, "Post created! ヽ(´▽`)/")
        |> redirect(to: post_path(conn, :show, post))
      {:error, %Ecto.Changeset{} = changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
  end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-08 14:07:03

更改了这一行:

代码语言:javascript
复制
 plug :set_topics when action in [:index, :new, :edit, :update, :fork]

对此:

代码语言:javascript
复制
plug :set_topics when action in [:index, :new, :edit, :create, :update, :fork]

添加了创建函数。表单现在通过了编译器,但是仍然存在一些验证错误。

*

若要修复表单验证:

我有一些领域在我的改变:

代码语言:javascript
复制
  defp post_changeset(%Post{} = post, attrs \\ %{}) do
 post
    |> cast(attrs, [:title, :body, :user_id, :published, :original_post_id, :topic_id, :plan, :done_so_far_one, :done_so_far_two, :done_so_far_three, :done_so_far_one_title, :done_so_far_two_title, :done_so_far_three_title, :name_of_gallery, :future_plans_title])
    |> cast_attachments(attrs, [:project_pic])
    |> validate_required([:title, :body, :user_id, :topic_id, :plan, :done_so_far_one, :done_so_far_two, :done_so_far_three,  :done_so_far_one_title, :done_so_far_two_title, :done_so_far_three_title, :project_pic, :name_of_gallery, :future_plans_title])

这在form.html.eex中不存在。验证表单时,菲尼克斯/Ecto期望所有字段。缺少的字段返回未经验证的表单的闪存错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45569199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档