所以在我尝试在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|
答案 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个操作。