Ruby on rails AJAX提交表单错误

时间:2015-12-02 15:22:21

标签: javascript jquery ruby-on-rails ruby ajax

所以我正在尝试使用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上,但是我现在只需要显示该表单。

1 个答案:

答案 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 中的部分相对应,因此请确保其存在。