2016-12-08 8 views
0

私はコメントボディを作成するためにhtmlフォームを埋めたいので、thread_iduser_idを知ってdbに挿入することができます。今、私はURLにthread_idを入れても困っています。URLから値を取得してアクションに渡す方法は?

さて、私はこのように見えるのルート抱えている:私はthread_id = 7私」を取得する必要があります

 thread_path GET  /manage/thread        Rumbl.ThreadController :index 
     thread_path GET  /manage/thread/:id/edit      Rumbl.ThreadController :edit 
     thread_path GET  /manage/thread/new       Rumbl.ThreadController :new 
     thread_path GET  /manage/thread/:id       Rumbl.ThreadController :show 
     thread_path POST /manage/thread        Rumbl.ThreadController :create 
     thread_path PATCH /manage/thread/:id       Rumbl.ThreadController :update 
        PUT  /manage/thread/:id       Rumbl.ThreadController :update 
     thread_path DELETE /manage/thread/:id       Rumbl.ThreadController :delete 
thread_comment_path GET  /manage/thread/:thread_id/comments   Rumbl.CommentController :index 
thread_comment_path GET  /manage/thread/:thread_id/comments/:id/edit Rumbl.CommentController :edit 
thread_comment_path GET  /manage/thread/:thread_id/comments/new  Rumbl.CommentController :new 
thread_comment_path GET  /manage/thread/:thread_id/comments/:id  Rumbl.CommentController :show 
thread_comment_path POST /manage/thread/:thread_id/comments   Rumbl.CommentController :create 
thread_comment_path DELETE /manage/thread/:thread_id/comments/:id  Rumbl.CommentController :delete 

とURL http://localhost:4000/manage/thread/7/comments/new からこの

def new(conn, %{"thread_id" => thread_id}) do 
    changeset = Comment.changeset(
     %Comment{}, 
     %{user_id: conn.assigns.current_user.id, 
     thread_id: thread_id 
     })  
    render(conn,"new.html", changeset: changeset) 
    end 

    def create(conn, %{"comment" => %{"content" => content}, "thread_id"=> thread_id}) do 
    user_id = conn.assigns.current_user.id 
    changeset = Comment.changeset(
     %Comment{ 
     content: content, 
     user_id: user_id, 
     thread_id: to_integer(thread_id) 
     }) 

    case Repo.insert(changeset) do 
     {:ok, _comment} -> 
     conn 
     |> put_flash(:info, "Comment created successfully.") 
     |> redirect(to: thread_path(conn, :index)) 
     {:error, changeset} -> 
     render(conn, "new.html", changeset: changeset) 
    end 
    end 

ようになりコントローラでアクションをそれを得るにはthread_id = 1アクション内に作成/ 2パターンマッチ"thread_id"=> thread_id。内部アクションnew/2私はthread_id = 7のhersパターンマッチから、私は接続経由で送信すると思ったが、それはうまくいきませんでした。 new.htmlからの新しいconnが返されたので、私はそれを推測していますか?ここで

も、私はEcto.Changeset changesフィールドを使用してthread_idを得ることができたことnew.htmlファイル

<h2>New comment</h2> 
<%= form_for @changeset, thread_comment_path(@conn,:create, @current_user), fn f -> %> 

    <%= if @changeset.action do %> 
    <div class="alert alert-danger"> 
     <p>Oops, something went wrong! Please check the errors below.</p> 
    </div> 
    <% end %> 

    <div class="form-group"> 
    <%= label f, :content, class: "control-label" %> 
    <%= textarea f, :content, class: "form-control" %> 
    <%= error_tag f, :content %> 
    </div> 
    <%= submit "Create Comment", class: "btn btn-primary" %> 
<% end %> 
+0

'thread_comment_path(@conn、:create、@current_user)の代わりに' thread_comment_path(@conn、:create、@id_thread) 'を試してください。 – Dogbert

+0

次に、GET/manage/thread/7/comments/newでエラーArgumentErrorを取得します。 @ id_threadはeexテンプレートでは使用できません。 適切な割り当てがすべて設定されていることを確認してください。この が子テンプレートの場合、自動的に転送されないので、割り当てが親テンプレート によって明示的に指定されていることを確認してください。 利用可能な割り当て:[:changeset、:conn、:current_user、:view_module、:view_template] – Daniel

+0

おっと、 'thread_comment_path(@conn、:create、@ changeset.data.thread_id)'を試してください。 – Dogbert

答えて

0

です。

<%= form_for @changeset, thread_comment_path(@conn,:create, @changeset.changes.thread_id), fn f -> %> 

しかし、これはアクションnew/2からチェンジを送信すると、本当にURL /manage/thread/7/comments/newからthread_idを取っていないことで回避策です。

+0

'params'から取り出すと、' @ conn.params ["thread_id"] 'を行うことができますが、通常は' render conn、...、thread_id:thread_id'と '@ thread_id'が使用されています。 – Dogbert

+0

これも動作しますが、これはまだ 'new/2'からhtmlにいくらかの値を渡していて、実際に'/manage/thread/7/comments/new'を使って 'thread_id'を取得していません。 – Daniel

関連する問題