在rails中使用jquery的Ajax提交无法正常工作

时间:2011-07-17 05:19:09

标签: jquery ruby-on-rails ruby ajax

我一直在尝试为我的Rails应用程序实现评论系统。我的应用中的每个事件都有自己的页面,页面上有一个评论主题。我希望用户能够使用ajax提交评论。我试图遵循RailsCast 136,这基本上是我想在我的应用程序中工作。但是,每当我发表评论时,ajax请求都没有通过,我收到错误:

  

在2011-07-17 00:39:16为127.0.0.1开始POST“/ events / undefined”   -0400

     

ActionController :: RoutingError(没有路由匹配“/ events / undefined”):

这是我在events_controller中显示动作的代码。

  

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 |   %GT;             <%if signed_in? %GT;             

<%= 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代码。它与RailsCast 136概述的代码几乎相同

  

jQuery.ajaxSetup({'beforeSend':function(xhr)   {xhr.setRequestHeader(“接受”,“text / javascript”)}})

     

$(document).ready(function(){$(“#commentform”)。submit(function(){         $ .post($(this).attr(“action”),$(this).serialize(),null,“script”);         返回false; })})

任何人都知道会出现什么问题?我对Rails和Web开发一般都很陌生,并感谢任何帮助解决这个问题。

编辑:我设法摆弄并解决问题。我基本上遵循vinceh布局的解决方案,除了嵌套我的路线并让它工作。谢谢你们。

非常感谢, SID

2 个答案:

答案 0 :(得分:0)

我在顶部看到了两件事。首先,您没有指定表单的发送位置。所以你需要将其改为

<%= 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 %> 

然后您需要在routes.rb文件夹中添加适当的路线,即

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

看看是否会产生新的东西。让我知道,我会不断更新这个答案。

如果你想要一个好的评论AJAX教程,请阅读this

祝你好运!

答案 1 :(得分:0)

根据您对vinceh的回答的评论,我想知道您是否可以通过在您的routes.rb中正确嵌套资源来使自己更轻松。修改现有的:events路由以提供一个块,如下所示:

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

然后,如果您的表单仍无效,请尝试以下操作:

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

这样,它会自动选择params中的:event_id作为帖子的一部分。