所以我正在尝试使用AJAX更新我的评论部分,而不需要为大学项目刷新整个页面。但是我似乎无法让这个工作。 在控制台中它给了我
无法加载资源:服务器响应状态为500(内部服务器错误)
我的show.html.erb文件:
<h1>Title: <%= @post.title %></h1>
<h2>Body: <%= @post.body %></h2>
<hr />
<h1>Your comments</h1>
<%= link_to "View comments", "#", id: "comments-link" %>
<ol id="comments">
<%= render 'comments' %>
<hr />
<h1>Create comment</h1>
<%= form_for(@comment, :html => {class: "form", role: "forms"}, :url => post_comments_path(@post), remote: true) do |comm| %>
<div class="container">
<div class="input-group input-group-md">
<%= comm.label :body %>
<%= comm.text_area :body, class: "form-control", placeholder: "Enter a comment" %>
</div>
<%= comm.submit "custom", id: "button" %>
</div>
<% end %>
</ol>
我的评论。咖啡:
$(document).on "page:change", ->
$('#comments-link').click ->
$('#comments').fadeToggle()
$('#comments_body').focus()
我的create.js.erb:
$('#comments').append("<%= j render @comment %>");
和我的评论控制员:
class CommentsController < ApplicationController
def index
end
def new
end
def new
@comment = Comment.new
end
def create
@comment = Comment.new(comment_params)
@comment.post_id = params[:post_id]
if @comment.save
flash[:success] = "Successfully created comment"
respond_to do |format|
format.html { redirect_to post_path(@comment.post_id) }
format.js
end
else
flash[:danger] = "Failed to create comment"
redirect_to root_path
end
end
private
def comment_params
params.require(:comment).permit(:body)
end
end
我可能错过了一些文件,所以请让我知道,它是基本的,因为它只是一个帖子和评论系统 - 项目不需要造型,所以是的。我一直在尝试这个过去4个小时,其他地方都没有用。我在这里看过,Youtube - 到处都没有别人的代码对我有用所以我来这里了!谢谢你的帮助。
编辑:
我注意到它说在错误响应中创建了一个视图,但是我创建了该视图并将注释的主体渲染到create.html.erb上,但是我现在只需要显示该表单。
答案 0 :(得分:3)
我注意到您要发布到网址post_comments_path(@post)。对于嵌套路由,执行以下操作可能更简洁:
1)直接发布到嵌套路线:
<%= form_for([@post, @comment], html: {class: "form", role: "forms"}, remote: true) do |comm| %>
2)确保你的路线在routes.rb中正确嵌套:
resources :posts do
resources :comments
end
3)重构你的CommentsController,通过@post实例进行构建:
class CommentsController < ApplicationController
before_action :get_post
def index
@comments = @post.comments
end
def new
@comment = @post.comments.build
end
def create
@comment = @post.comments.build(comment_params)
if @comment.save
flash[:success] = "Successfully created comment"
respond_to do |format|
format.html { redirect_to post_path(@post) }
format.js
end
else
respond_to do |format|
format.html { render :new }
format.js { render :error }
end
end
end
private
def comment_params
params.require(:comment).permit(:body)
end
def get_post
@post = Post.find(params[:post_id])
end
end
4)在 app / views / comments / error.js.erb 中渲染验证错误。我会让你决定如何最好地做到这一点,但这是一个快速转储到控制台:
<% @comment.errors.full_messages.each do |message| %>
console.log("<%= message %>");
<% end %>
不要将此文件与处理成功保存评论的 app / views / comments / create.js.erb 混淆。这应该是这样的:
$('#comments').append("<%= j render @comment %>");
$(".form")[0].reset();
5)稍微调整你的观点。我注意到你需要以不同的方式输出注释:
<ol id="comments">
<%= render @post.comments %>
</ol>
应与 app / views / comments / _comment.html.erb 中的部分相对应,因此请确保其存在。