ActionController :: InvalidAuthenticityToken控制器中的错误

时间:2016-06-21 13:29:26

标签: ruby-on-rails ajax

所以在我尝试在rails应用程序中实现AJAX注释后,我开始收到此错误:

ActionController::InvalidAuthenticityToken in CommentsController#create    

ActionController::InvalidAuthenticityToken

    def handle_unverified_request
      raise ActionController::InvalidAuthenticityToken
    end
  end
end

以下是相关文件中的所有代码:

comments_controller.rb

class CommentsController < ApplicationController


  before_action :find_post

  def create  
    @comment = @post.comments.build(comment_params)
    @comment.user_id = current_user.id

    if @comment.save
      respond_to do |format|
        format.html { redirect_to root_path }
        format.js
      end
    else
      flash[:alert] = "Check the comment form, something went horribly wrong."
      render root_path
    end
  end

添加评论表单:

= form_for([post, post.comments.build], remote: true) do |f|
  = f.text_field :content, placeholder: 'Add a comment...', class: "comment_content", id: "comment_content_#{post.id}"

视图/评论/ create.js.erb

$('#comments_<%= @post.id %>').append("<%=j render 'comments/comment', post: @post, comment: @comment %>");
$('#comment_content_<%= @post.id %>').val('')

comment.rb

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

我不知道是什么导致了这个错误,因为它在引入AJAX之前运行良好。我查找了stackoverflow上类似问题的答案,并在protect_from_forgery的顶部添加了comments_controller.rb无效。我没有得到InvalidAuthenticityToken错误,但相反,它给了我一个不同的错误:

NoMethodError in CommentsController#create

undefined method `id' for nil:NilClass

def create  
  @comment = @post.comments.build(comment_params)
  @comment.user_id = current_user.id #highlighted line

  if @comment.save
    respond_to do |format|

3 个答案:

答案 0 :(得分:0)

你必须在表单中发送一个真实性令牌,它应该在你的form_for中生成,所以我猜你的ajax就是不发送它。

如果没有自动生成,您可以手动执行:<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

答案 1 :(得分:0)

除非config.action_view.embed_authenticity_token_in_remote_forms设置为true(默认值为false),否则如果表单是远程表单,Rails将不会生成包含csrf标记的隐藏输入。

这是因为ajax驱动的表单有另一种获取令牌的机制。此更改意味着您现在可以对包含此表单的缓存html进行分段,因为它不再包含为每个用户更改的内容。

这种机制是将csrf标记添加到页面的元标记中,rails javascript可以读取并添加到ajax请求中。有一个帮助器,csrf_meta_tags可以为您执行此操作 - 只需在您正在渲染的html的<head>中添加一个调用(这通常位于您的布局文件中)。

答案 2 :(得分:0)

解决我的问题的方法是在控制器内部放置第一行:

skip_before_action :verify_authenticity_token, :only => [:create,:inquire_enterprise]

如您所见,我正在逃避产生错误的2个操作。