我一直在尝试为我的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%>
<%else%>
<%= f.text_field:author,:value => current_user.name%><%= 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
答案 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作为帖子的一部分。