Значение где нельзя привести к типу: id в запросе - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь присоединить свои комментарии к сообщению, чтобы при посещении пользователем / posts /: id / comments он / она мог просматривать все комментарии, связанные с этим сообщением.

Это мой роутер

resources "/posts", PostController, except: [:new, :edit] do
   resources "/comments", CommentController, except: [:new, :edit]
end

Тогда мой контроллер сообщений:

def index(conn, _params) do
    post = Posts.list_posts()
    render(conn, "index.json", posts: posts)
end

def create(conn, post_params) do
    with {:ok, %Post{} = post} <-Posts.create_post(post_params) do 
       #create_post is from post context
    conn
    |> put_status(:created)
    |> put_resp_header("location", post_path(conn, :show, post))
    |> render("show.json", post: post)
  end
end

def show(conn, %{"id" => id}) do
    post = Repo.get!(Post, id)
    comment_changeset = Comment.changeset(%Comment{})
    render(conn, "show.json", post: post, comment_changeset: 
    comment_changeset)
end

Мой контроллер комментариев:

def index(conn, _params) do
    comment= Comment.list_comment() #from comment context
    render(conn, "index.json", comments: comments)
end

def create(conn, comment_params) do
    post = Repo.get(Post, comment_params)
    comment_changeset = Ecto.build_assoc(post, :comment, 
    comment_params)
    Repo.insert(comment_changeset)

    conn
    |> put_status(:created)
    |> render("show.json")
end

def show(conn, %{"id" => id}) do
  comment = Comment.get_comment!(id) #from comment context
  render(conn, "show.json", comment: comment
end

Когда я пытаюсь добавить новый комментарий в пост /: id / comments, выдает эту ошибку:

(Ecto.Query.CastError) deps/ecto/lib/ecto/repo/queryable.ex:348: value 
`%{"description" => "bitcoin", "post_id" => "2", "name" => "ethereum"}` 
in `where` cannot be cast to type :id in query:

from m in Myapp.Posts.Post,
 where: p.id == ^%{"description" => "bitcoin", "post_id" => "2", "name" 
=> "ethereum"},
  select: p

Это мой Myapp.Posts.Post:

schema "posts" do
    field :description, :string
    field :name, :string
    has_many :comments, Myapp.Comments.Comment
    field :body, :string

    timestamps()
  end

  @doc false
 def changeset(post, attrs) do
    post
    |> cast(attrs, [:name, :description, :body])
    |> validate_required([:name, :body ])
 end

И мой Myapp.Comments.Comment

 schema "comments" do
    field :description, :string
    field :name, :string
    belongs_to :market, Myapp.Posts.Post

    timestamps()
 end

  @doc false
 def changeset(comment, attrs) do
    pair
    |> cast(attrs, [:name, :description])
    |> validate_required([:name, :description])
 end

Из-за ошибки я думаю, что ecto пытается передать все параметры запроса как p.id, но это не должно быть так, пожалуйста, как я могу это исправить?Я провел много исследований и попробовал некоторые изменения, но получил другие ошибки.

1 Ответ

0 голосов
/ 11 октября 2018

Проблема здесь:

Repo.get(Post, comment_params)

Параметр комментария - это то, что получает контроллер, и это то, что вы видите в своем сообщении об ошибке:

%{"description" => "bitcoin", "post_id" => "2", "name" => "ethereum"}

OTOH Repo.get/3 ожидает идентификатор записи в качестве второго поля.Примерно так будет работать:

def create(conn, %{"post_id" => id} = comment_params) do
  post = Repo.get(Post, String.to_integer(id))
...