2011-10-17 12 views
0

ブラウザのアドレスバーにはhttp://localhost:3000/comment/index?post_id=6がありますが、インデックスのpost_idにアクセスできますが、作成アクションでコメント/投稿を作成しようとすると、投稿IDなしの投稿がログに見つかりませんでした。ここでは何が起こっているのですか?前もって感謝します。:IDはありますが、アクセスできません。これはどのように可能ですか?

コメントコントローラ:

def index 
    @post=Post.find(params[:post_id]) 
end 

def create 
    @post  = Post.find(params[:post_id]) 
    @comment = @post.comments.build(params[:comment]) 
    @comment.save 

    respond_with(@comment, :layout => !request.xhr?)   
end 

comments/indexビュー:ログで

<%= form_for :comment, :remote => true, 
         :url => { :controller => "comments", 
           :action  => "create" 
           }, 
         :html => { :id => 'new-comment'} do |f| 
%> 
    <%= f.hidden_field :post_id, :value => @post.id %> 
    <%= f.text_area :body %> 
    <%= f.submit "post" %> 
<% end %> 

Started POST "/comments" for 127.0.0.1 at 2011-10-17 14:06:36 -0700 
    Processing by CommentsController#create as JS 
    Parameters: {"utf8"=>"✓", 
    "authenticity_token"=>"cxQm2K2xwsyw0DY2XLNvkcMQI+wM96LpEENbfQqxu5c=", 
    "comment"=> {"post_id"=>"6", "body"=>"This is the comment"}, 
    "commit"=>"post"} 
    Completed 404 Not Found in 23ms 

    ActiveRecord::RecordNotFound (Couldn't find Post without an ID): 

答えて

4

あなたは、あなたのログにparamsハッシュで見てみるならば」これを見てください:

{ "utf8"=>"✓", 
    "authenticity_token"=>"cxQm2K2xwsyw0DY2XLNvkcMQI+wM96LpEENbfQqxu5c=", 
    "comment"=> { 
     "post_id"=>"6", # <-- there's your post_id 
     "body"=>"This is the comment" }, 
    "commit"=>"post" } 

投稿IDはそこにありますが、それはcommentハッシュの内側です。作成アクションでは、次のように変更するだけです:

def create 
    @post=Post.find(params[:comment][:post_id]) 
    @comment = @post.comments.build(params[:comment]) 
    @comment.save 
    respond_with(@comment, :layout => !request.xhr?)   
end 

ただし、作成アクションを少し簡略化する必要があります。

def create 
    @comment = Comment.new(params[:comment]) 
    @comment.save 
    respond_with(@comment, :layout => !request.xhr?) 
end 

post_idcommentのparamsであるので、あなたはそれを作成するときに、コメントが自動的にレコードを検索しなくても、ポストに関連付けられます。あなたのビューで投稿にアクセスする必要がある場合は、@comment.postを使用できます。

+0

ありがとう、エミリーそれは非常に有用だった – katie

1

フォームにhidden_fieldとしてフィールドを渡さないでください。これを行うには良い方法は次のように行くことになります:あなたは醜いを使用した未

  1. <%= form_for :comment, 
          :remote => true, 
          :url => post_comments_path(post) 
          :html => { :id => 'new-comment'} do |f| %> 
    

    Railsはあなたを提供してルーティングヘルパーを使用することにより、これがして、フォームをクリーンアップしますあなたのフォームのURLを生成するためのハッシュ構文

  2. hidden_fieldをURLに送信するためのフォームに入れないでください。
  3. DHHのように、ポストパラメータparams[:post_id]を自動的に送信します。これよりもむしろ

    Post.find(params[:post_id]) 
    

    、型に不必要に長いため、より痛いです:

これは、あなたがこのコード行を使用して、アクションでそれを見つけることができるだろう意味

Post.find(params[:comment][:post_id]) 
関連する問題