我试图让用户在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);
答案 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
?这就是路径渲染不正确的原因。