对于基本博客应用程序(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) %>
我该如何解决这个问题?
答案 0 :(得分:1)
在web/controllers/post_controller.ex
中,将conn.assigns.post
替换为post
,因为它是变量的实际名称。
要从另一个视图渲染模板,(您希望从web/templates/comment/form.html.eex
渲染web/templates/post/show.html.eex
),您需要将目标模板的视图作为第一个参数传递:
render MyApp.CommentView, "form.html", ...
这是因为控制器中的render
为Phoenix.Controller.render/4
,而视图和模板内的可用内容为Phoenix.View.render/3
,并且他们需要不同的参数。