设计在post上登出到不同的路线

我和Devise有一个非常奇怪的问题。 我有一个路由设置,接受get和post请求。 在获取时,它显示表单,在post上,它提交它。

当我向路线发送XHR后,当它到达那里时,它告诉我我没有登录,并且发送给我一个未经授权的401。 之后我必须登录,然后我可以再试一次。

我一直试图弄清楚这几个小时,我能够弄清楚的是我的控制器方法没有被调用。 我在过滤之前输入了我自己的自定义身份validation,它刚刚确认,当我的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="?n=7&cType=&fid=" method="post" enctype="multipart/form-data">   
Add / Drag Files To Upload

正在上传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问题的forms:

 <%= form_for :some_model, authenticity_token: false do%>