2016-05-03 292 views
0

基本的なブログアプリケーション(Post )については、post#showの最後に新しいコメントフォームを表示したいと考えています。しかし、私はそれを構築してweb/templates/comment/form.html.eexweb/templates/user/show.html.eexにレンダリングする仕組みに固執しています。アプリケーション:私が最初に持ってPostコントローラで投稿の最後に新しいコメントフォームを表示する#show

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 

問題。このコードは(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) %> 

私はこれをどのように修正することができますか?それは、変数の実際の名前だとweb/controllers/post_controller.ex

答えて

1
  1. 、ちょうどpostconn.assigns.postを交換してください。

  2. (あなたがweb/templates/post/show.html.eexからweb/templates/comment/form.html.eexをレンダリングする)、別のビューからテンプレートをレンダリングするために、あなたが最初の引数としてターゲットテンプレートのビューに合格する必要があります。

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

    renderであるためですコントローラーはPhoenix.Controller.render/4ですが、ビューとテンプレート内で利用できるものはPhoenix.View.render/3で、それぞれ異なるパラメーターが必要です。

関連する問題