2011-07-17 13 views
0

私はRailsアプリケーションのためのコメントシステムを実装しようとしています。私のアプリのすべてのイベントはそれ自身のページであり、ページ上にはコメントスレッドがあります。ユーザーがajaxを使ってコメントを投稿できるようにしたい。私はRailsCast 136に従おうとしました。これは基本的に私のアプリで仕事をしたいものです。しかし、私はコメントを投稿するたびに、AJAXリクエストが通過していません、と私はエラーを受信して​​います:jQueryを使ったAjaxの投稿がうまくいかない

Started POST "/events/undefined" for 127.0.0.1 at 2011-07-17 00:39:16 -0400

ActionController::RoutingError (No route matches "/events/undefined"):

ここに私events_controllerの私のshowアクションのためのコードです。

def show

@event = Event.find(params[:id]) 

@comment = Comment.new 

session[:event_id] = @event.id 

@comments = @event.comments.reverse 
end 

ここは、私のイベントショービューのコメントフォームのコードです。

<%= form_for(@comment, :remote => true) do |f| %> <% if signed_in? %>

<%= f.label :author %>
<%= f.text_field :author, :value => current_user.name %>

<% else %>

<%= f.label :author %>
<%= f.text_field :author %>


<% end %>

 <p><%= f.label :content %><br /> 
     <%= f.text_field :content %></p> 

     <p><%= f.submit %></p> <% end %> </div> 

ここに、私のcomments_controllerの作成アクションのコードがあります。

def create 
    @comment = Comment.create!(params[:comment]) 
    @comment.event_id = session[:event_id] 
    session[:event_id] = nil 
    flash[:success] = "Comment sent!" 
    respond_to do |format| 
    format.html { redirect_to @comment.event } 
    format.js 
    end 
    end 

ここでは、ajaxで投稿するjQueryコードを示します。これはかなり136

jQuery.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} })

$(document).ready(function(){ $("#commentform").submit(function(){ $.post($(this).attr("action"), $(this).serialize(), null, "script"); return false; }) })

誰が間違って行くことができるものの任意のアイデアを持っているRailsCastが概説したコードと同じですか?私はRailsとWeb開発の一般的な点で非常に新しく、これを修正する助けに感謝します。

EDIT:問題を解決して修正しました。私は本質的に私のルートを入れ子にすることに加えてvincehがレイアウトしたソリューションを実行し、それを動作させました。みんなありがとう。

本当にありがとうございましたが、 シド

答えて

0

私は右の上に2つのことを参照してください。まず、フォームの送信先を指定していません。だから、

<%= form_for @comment, :url => {:controller => :comments, :action => :create}, :remote => true do |f| %> 

    <% if signed_in? %> 

    <%= f.label :author %> 
    <%= f.text_field :author, :value => current_user.name %> 

    <% else %> 

    <%= f.label :author %> 
    <%= f.text_field :author %> 

    <% end %> 

    <p><%= f.label :content %><br /> 
    <%= f.text_field :content %></p> 

    <p><%= f.submit %></p> 
<% end %> 

にそれを変更する必要があります次に、あなたはそれが何か新しいものを生成する場合を参照してください。つまり

match "comments/create" => "comments#create" 

、あなたのroutes.rbフォルダ内の適切なルートを追加する必要があります。私に教えてください。私はこの回答を更新し続けます。

良いコメントAJAXチュートリアルをお望みなら、thisを読んでください!

幸運を祈る!

+0

ちょっとvinceh、 ありがとうございます。私はこれらのコード行を追加しましたが、同じエラーメッセージがログに表示されています。私は何かが私の作成アクションをコーディングした方法で間違っていると思う。私がsubmitをクリックすると、エラーの原因となっているurl/events/undefinedを読み込もうとします。 – Sid

+0

私はもう少し問題があります。まず、フォームを提出すると、format.jsの代わりにformat.htmlを使用してフォームを処理し続けます(これはPOST Started "/ comments"というエラーを127.0.0.1に与えます)2011-07-17 02:51 :50 -0400 CommentsControllerによる処理#HTMLとして作成 )。 コメントが作成されると、railsはセッションハッシュからevent_idを読み取ることができず、コメントにevent_idを割り当てることができません。すべての助けをありがとう! – Sid

0

vincehの回答に対するあなたのコメントに基づいて、routes.rbにリソースを適切に入れ子にすることで、自分自身で簡単にできるかどうか疑問に思っています。そのように、ブロックを提供するために、イベントルート:既存を変更

<%= form_for(@comment, :url => event_comments_url(@event), :remote => true) do |f| %> 

この方法では、それが自動的にピックアップします:フォームはまだ動作しない場合

resources :events do 
    resources :comments, :only [:create] 
end 

そして、これは試しますポストの一部としてparamsの:event_id

+0

ちょっとjustin、 ありがとうございます。私は今、respond_toブロックが作成アクションをHTMLとして正しく処理していますが、format.jsを実行しているところです。私はformat.html行をコメントアウトしようとしましたが、投稿しようとすると、http:///.0.0.0:3000/events/1/commentsにリダイレクトされました。また、別の注釈として、reply_toブロックは、comment.saveのif文に含めない限り動作しません。何か案は?再度、感謝します! – Sid

関連する問題