设计正在邮寄到不同的路径

问题描述

我在Devise中遇到了一个非常奇怪的问题。我设置了一个既接受get请求又发布post请求的路由。即时获取显示表单,在帖子上,提交表单。 当我向该路线发送XHR帖子时,到达目的地时,它告诉我我尚未登录,并向我发送了未经授权的401。之后,我必须登录,然后再试一次。 我已经尝试解决了几个小时,我只能弄清楚我的控制器方法没有被调用。我在过滤器之前放入了自己的自定义身份验证,它只是确认在我的rails应用程序被调用时,该用户不再登录。 另外,如果我打开表格但不提交,我可以照常继续。在XHR的某个地方,它正在使设计退出我。 如果您有任何想法请帮忙,我不知道现在发生了什么... 谢谢 -斯科特 编辑:添加相关的代码 routes.rb
match \'projects/:p/fileBox\' => \'projects#show\',:via => [\"get\",\"post\"],:as => \'project_fileBox\'
projects_controller.rb
before_filter :authenticate_user! # <--- By the time this gets called,the user is logged out
def show
# ^^^^ Doesnt get called. Logger shows that it recognized route though
logger.debug \"-----------projects#show\"
logger.debug \"Current user logged in:\"+user_signed_in?.to_s
提交的表格
<form class=\"upload\" action=\"<%= project_fileBox_path(@project) %>?n=7&cType=<%= cType %>&fid=<%= fid %>\" method=\"post\" enctype=\"multipart/form-data\">
    <input type=\"file\" name=\"file\" multiple/>
    <button>Upload</button>
    <div>Add / Drag Files To Upload</div>
</form>
上传XHR的Javascript
formDataUpload = function (files,xhr,settings) {
            var formData = new FormData(),i;
            $.each(getFormData(settings),function (index,field) {
                formData.append(field.name,field.value);
            });
            for (i = 0; i < files.length; i += 1) {
                formData.append(settings.fieldName,files[i]);
            }
            xhr.send(formData);
        }
如果我错过了一些相关的代码,请告诉我     

解决方法

除了JS之外,这里没有太多要做的事情了,但是您确实遇到了很大的改变,因为CSRF令牌没有被设置为请求的一部分。在各种Rails 3.0.x版本中,这已经发生了变化,因此即使没有代码也很难确定。 一个彻底的简单测试就是关闭CSRF(例如,从ApplicationController中删除protect_from_forgery)。如果可行,则您有答案,并且需要确保令牌被传递,否则您将进行伪造保护。     ,当我在一个页面中有两个表单时,我遇到了同样的问题,其中一个表单发布到应用程序内的路由,另一表单发布到外部地址。 John Paul Ashenfelter是对的,它与JS无关。 像您一样,我不想为整个站点禁用CSRF。我最终对发布到控制器中异地地址的方法禁用了防伪保护:
protect_from_forgery :except => [:some_method]
并以创建此CSRF问题的形式出现:
<%= form_for :some_model,authenticity_token: false do%>