Rails中的AJAX。无法在帖子上创建评论

时间:2015-03-05 15:00:55

标签: ruby-on-rails ajax forms

我试图让用户在Rails中使用AJAX在特定帖子上创建评论。我得到要显示的表单,但在创建它不起作用。在我的表格中,它表示href =" / posts / post_id / comments / new"方法="后&#34 ;.我认为它应该只是post / post_id / comments with method =" post",但我不能让它工作。

控制台只是说没有路由匹配POST post / id / comments / new,因为它显然是错误的。

comments_controller.rb

class CommentsController < ApplicationController

respond_to :html, :js

def index 
    @comments = Comment.all
end 

def new
    @new_comment = Comment.new
end

def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(comment_params)
end
评论视图中的

_form.html.erb

<%= simple_form_for post_comments_path, remote: true, html:{class: 'form-inline'} do |f| %>
  <%= f.input :body, input_html: { class: 'form-control' } %>
  <%= f.button :submit, :class => "btn btn-success", value: "Post Comment" %>
<% end %>

index.html.erb(带帖子的主视图)

    <div class="pull-left">
      <%= link_to new_post_comment_path(post), remote: true, method: :get do %>
          <button class="btn btn-primary">+Comment</button>
      <% end %>
    </div>
    <div id="comment-form" style="display:none;"></div>
    <% if post.comments.count > 0 %>
      <div id="comments"><%= render @comments %></div>
    <% end %>
评论中的

new.js.erb

$('#comment-form').html("<%= j (render 'form') %>");
$('#comment-form').slideDown(350);

在评论中创建.js.erb

$('#comments').html("<%= j (render @comments) %>");
$('#comment-form').slideUp(350);

2 个答案:

答案 0 :(得分:2)

您不应该将路径助手传递给form_for帮助程序。改为给它一个模型,它会生成正确的url。试试这个:

<%= simple_form_for @new_comment, remote: true, html:{class: 'form-inline'} do |f| %>
  <%= f.input :body, input_html: { class: 'form-control' } %>
  <%= f.button :submit, :class => "btn btn-success", value: "Post Comment" %>
<% end %>

<强>更新 您似乎正在使用嵌套资源。在这种情况下,您需要调整#new控制器方法。

def new
  @post = Post.find(params[:post_id])
  @new_comment = Comment.new
end

然后将@post和@new_comment传递给form_for。同样,这应该足以让Rails找出发布表单的位置。

<%= simple_form_for [@post, @new_comment], remote: true, html:{class: 'form-inline'} do |f| %>
  <%= f.input :body, input_html: { class: 'form-control' } %>
  <%= f.button :submit, :class => "btn btn-success", value: "Post Comment" %>
<% end %>

<强>更新 你在create.js.erb中输错,@comments没有被定义,它应该是单数:@comment 还要确保你实际上有_comment部分:)

$('#comments').html("<%= j (render @comment) %>");
$('#comment-form').slideUp(350);

答案 1 :(得分:0)

由于您尝试通过表单将评论绑定到帖子,因此您需要将@post传递到路径中。所以它看起来像:

阅读以下评论后

更新

<%= simple_form_for [@post, @new_comment], remote: true, html:{class: 'form-inline'} do |f| %>
  <%= f.input :body, input_html: { class: 'form-control' } %>
  <%= f.button :submit, :class => "btn btn-success", value: "Post Comment" %>
<% end %>

注意@post?这就是路径渲染不正确的原因。