在帖子#show结束时呈现一个新的评论表单

时间:2016-05-03 12:31:36

标签: elixir phoenix-framework

对于基本博客应用程序(Post has_many comments),我想在post#show末尾显示新的评论表单。但是我坚持使用构建它并在web/templates/comment/form.html.eex中呈现web/templates/user/show.html.eex的机制。申请:

mix phoenix.new my_app
cd my_app
mix ecto.create
mix phoenix.gen.html Post posts content:string
mix phoenix.gen.html Comment comments content:string \
post_id:references:posts
mix ecto.migrate

网络/模型/ post.ex

defmodule MyApp.Post do
  use MyApp.Web, :model

  schema "posts" do
    field :content, :string
    has_many :comments, MyApp.Comment

    timestamps
  end

  @required_fields ~w(content)
  @optional_fields ~w()

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end

网络/模型/ comment.ex

defmodule MyApp.Comment do
  use MyApp.Web, :model

  schema "comments" do
    field :content, :string
    belongs_to :post, MyApp.Post

    timestamps
  end

  @required_fields ~w(content post_id)
  @optional_fields ~w()

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end

Post控制器中我遇到了第一个问题。此代码无效(key :post not found in: %{}错误):

网络/控制器/ post_controller.ex

[...]
def show(conn, %{"id" => id}) do
  post = Repo.get!(Post, id)

  changeset =
    conn.assigns.post
    |> build_assoc(:comments)
    |> Comment.changeset()

  render(conn, "show.html", post: post, changeset: changeset)
end
[...]

下一个问题是我不知道如何渲染表单。以下代码不起作用:

网络/模板/后/ show.html.eex

<h2>Show post</h2>

<ul>
  <li>
    <strong>Content:</strong>
    <%= @post.content %>
  </li>
</ul>

<%= render "comment/form.html", changeset: @changeset,
                        action: comment_path(@conn, :create) %>

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

  1. web/controllers/post_controller.ex中,将conn.assigns.post替换为post,因为它是变量的实际名称。

  2. 要从另一个视图渲染模板,(您希望从web/templates/comment/form.html.eex渲染web/templates/post/show.html.eex),您需要将目标模板的视图作为第一个参数传递:

    render MyApp.CommentView, "form.html", ...
    

    这是因为控制器中的renderPhoenix.Controller.render/4,而视图和模板内的可用内容为Phoenix.View.render/3,并且他们需要不同的参数。