【发布时间】:2015-05-26 21:27:59
【问题描述】:
我正在运行 Rails 4.2、Devise 3.4.1 和 CanCan 1.6.10。当我尝试通过如下所示的标准删除按钮删除资源时,我会退出并重定向到登录页面。
<a data-confirm="Are you sure?" class="btn-alert" rel="nofollow" data-method="delete" href="/admin/lots/6">Delete</a>
我的开发日志告诉我这是因为它“无法验证 CSRF 令牌的真实性”。我似乎可以让它工作的唯一方法是从删除按钮更改为发布到删除操作的表单,但这有点愚蠢。我已经在其他 Rails 4 应用程序中做到了这一点,所以我很确定我做得对。
index.html.erb
<% if can? :destroy, lot %>
<%= link_to "Delete", admin_lot_path(lot.id), method: :delete, data: {confirm: "Are you sure?"}, class: 'btn-alert' %>
<% end %>
lots_controller.rb
class Admin::LotsController < ApplicationController
before_filter :authenticate_user!
load_and_authorize_resource
def destroy
@lot.destroy
redirect_to admin_lots_path, notice: "Lot was successfully removed."
end
end`
就像我说的,用表单替换按钮似乎可行,但这并不理想。
<%= form_for([:admin, lot], method: :delete) do |f| %>
<%= f.submit value: "Delete", class: 'btn-standard', data: {confirm: "Are you sure?"} %>
<% end %>
如果我从控制器中注释掉before_filter :authenticate_user! 和load_and_authorize_resource,它就可以工作。我假设 csrf 令牌没有与此请求一起发送,就像它在表单中一样。
有人对我可以尝试什么有任何想法吗?如果有帮助,愿意发布更多代码。顺便说一句,我的应用程序中的所有删除都会发生这种情况。
更新:这是来自 development.log 的 sn-p
Started DELETE "/admin/lots/6" for 127.0.0.1 at 2015-05-26 15:03:22 -0500
Processing by Admin::LotsController#destroy as HTML
Parameters: {"id"=>"6"}
Can't verify CSRF token authenticity
【问题讨论】:
-
您可能缺少对 Rails UJS 的正确 JavaScript 支持。你确定你已经正确加载了
application.js? -
是的,我在里面有
//= require jquery_ujs -
任何不寻常的 JavaScript 错误?您的 POST 请求是否看起来不错,就像它包含 CSRF 令牌一样?网络检查器在这里提供帮助。
-
你能显示你的日志吗?
-
网络面板中的一切看起来都不错,302 响应,正在发送带有隐藏输入
_method: "delete"的 POST。
标签: ruby-on-rails ruby-on-rails-4 devise