Rails、jQuery、Ajax-无法发送自定义标题

Rails、jQuery、Ajax-无法发送自定义标题,jquery,ruby-on-rails,json,ajax,request,Jquery,Ruby On Rails,Json,Ajax,Request,我正试图向rails api发送自定义标题,但我一直得到这个愚蠢的选项 ActionController::RoutingError(没有与[OPTIONS]匹配的路由“/api/v1/surveys”) 我已经启用了我想在APIapplication\u controller.rb中发送的头文件,至少我认为我启用了,方法是在其中包含以下代码: 在\u筛选器之前:允许\u跨\u域 私有的 def允许跨域 标题['Access-Control-Allow-Origin']='*' 标题['Acce

我正试图向rails api发送自定义标题,但我一直得到这个愚蠢的选项

ActionController::RoutingError(没有与[OPTIONS]匹配的路由“/api/v1/surveys”)

我已经启用了我想在API
application\u controller.rb中发送的头文件,至少我认为我启用了,方法是在其中包含以下代码:

在\u筛选器之前:允许\u跨\u域
私有的
def允许跨域
标题['Access-Control-Allow-Origin']='*'
标题['Access-Control-Allow-Methods']='POST、GET、PUT、DELETE、OPTIONS'
标题['Access-Control-Allow-headers']=“X-User-Token,X-User-Email,来源,内容类型,接受,授权,Token”
结束
我正在尝试发送
X-User-Token
X-User-Email
标题

因此,在我的客户方面,我打了以下电话:

$.ajax({
标题:{
“接受”:“应用程序/json”,
“内容类型”:“应用程序/x-www-form-urlencoded”,
“X-User-Email”:my@email.com',
“X-User-Token”:“fj4402SDgsGDS42”
},
url:Host.address+'/api/v1/surveys',
键入:“GET”,
}).done(函数(响应){});
在发送之前,我也尝试过

$.ajax({
url:Host.address+'/api/v1/surveys',
键入:“GET”,
发送前:函数(xhr){
setRequestHeader('Accept','application/json');
setRequestHeader('Content-type','application/x-www-form-urlencoded');
xhr.setRequestHeader('X-User-Email','my@email.com');
setRequestHeader('X-User-Token','fj4402SDgsGDS42');
},
}).done(函数(响应){}
只有当我发送
X-User-Email
X-User-Token
时,它才会断开。当我仅发送
Accept
内容类型
标题时,它会按预期工作

有人知道是什么导致了这个问题吗

编辑:
我没有提到我正在使用Desive进行用户身份验证。
添加
调查的路线
(我想您不需要全部路线:)

Rails.application.routes.draw do
为:用户设计,跳过:[:注册,:会话]
名称空间:api,as:false do
名称空间:v1,as:false do
资源:响应,仅:[:索引,:新建,:创建]
资源:调查,仅:[:索引,:创建,:显示]
结束
结束
结束
surveys-GET/api/v1/surveys(:格式)api/v1/surveys#index
POST/api/v1/调查(:格式)api/v1/调查#创建
调查获取/api/v1/surveys/:id(:格式)api/v1/surveys#show
我在浏览器控制台中遇到的错误是:

选择权

无法加载XMLHttpRequest。对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。因此,不允许访问源“”。响应的HTTP状态代码为404


尝试在application.rb文件中设置自定义标题

config.action_dispatch.default_headers = {
    'Access-Control-Allow-Origin' => 'YOUR_URL',
    'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
  } 
在app/controllers/api/v1/application_controller.rb文件中,按如下方式设置标题

before_filter :allow_cross_domain

def allow_cross_domain
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Expose-Headers'] = 'ETag'
    headers['Access-Control-Allow-Methods'] = 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD'
    headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,If-Modified-Since,If-None-Match'
    headers['Access-Control-Max-Age'] = '86400'
end 
最后,在应用程序/controllers/api/v1/controller\u中,您的\u正在从\u browser.rb调用访问\u:

before_filter :allow_cross_domain 

在rails指南中签出。同时检查浏览器中的控制台日志,以查看从上述请求中得到的错误。

尝试在application.rb文件中设置自定义标题

config.action_dispatch.default_headers = {
    'Access-Control-Allow-Origin' => 'YOUR_URL',
    'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
  } 
在app/controllers/api/v1/application_controller.rb文件中,按如下方式设置标题

before_filter :allow_cross_domain

def allow_cross_domain
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Expose-Headers'] = 'ETag'
    headers['Access-Control-Allow-Methods'] = 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD'
    headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,If-Modified-Since,If-None-Match'
    headers['Access-Control-Max-Age'] = '86400'
end 
最后,在应用程序/controllers/api/v1/controller\u中,您的\u正在从\u browser.rb调用访问\u:

before_filter :allow_cross_domain 

在rails指南中签出。同时检查浏览器中的控制台日志,以查看从上述请求中得到的错误。

您可以尝试将
:选项添加到路由中:

namespace :api, as: false do
  namespace :v1, as: false do
    resources :responses, only: [:index, :new, :create] 
    match 'surveys' => "surveys#index", via: [:get, :options] 
    resources :surveys, only: [:index, :create, :show]
  end
end

您可以尝试将
:选项
添加到您的路线:

namespace :api, as: false do
  namespace :v1, as: false do
    resources :responses, only: [:index, :new, :create] 
    match 'surveys' => "surveys#index", via: [:get, :options] 
    resources :surveys, only: [:index, :create, :show]
  end
end


你能粘贴你的routes.rb吗?刚刚编辑了帖子,并添加了routes.rb。你粘贴了
rake routes
…你能粘贴routes.rb文件的相关部分吗?Ups.My bad。现在我粘贴了文件…你能粘贴你的routes.rb吗?刚刚编辑了帖子,并添加了routes.rb。你粘贴了
rake routes
…c的结果你能发布routes.rb文件的相关部分吗?Ups.My bad.现在我粘贴了这个文件…我刚刚尝试过。我在
应用程序.rb
文件中设置了默认标题,并且我添加了它们,就像我在
允许跨域
中添加的一样。仍然没有运气。@antonpot我已经更新了上面的答案。我还添加了通用heallow_cross_domain方法用于测试目的感谢您花时间。我不确定您希望我在过滤之前对
做什么:allow_cross_domain
。您希望我把它放在哪里?我尝试过的是,在
application.rb
中配置默认标题,并根据您的需要修改
application\u controller.rb
建议。遗憾的是,它仍然返回相同的错误。@antonpot我已更新了上面的答案,其中显示了在当前代码库中添加以下内容的位置。如果上述方法不起作用,我们可以通过stackoverflow聊天,以防长评论。此解决方案也不起作用。我决定改用查询参数。我尝试了刚才。我在
application.rb
文件中设置了默认标题,并且添加了它们,就像在
\allow_cross_domain
中一样。仍然不走运。@antonpot我已经更新了上面的答案。此外,为了测试目的,我在allow_cross_domain方法中添加了通用标题。谢谢你花时间。我不确定该怎么做你想让我在过滤前使用
:允许跨域
。你想让我把它放在哪里?我试过的是,在
application.rb
中配置默认标题,并按照你的建议修改
application\u controller.rb
。遗憾的是,它仍然返回相同的错误。@antonpot我已经更新了上面的答案,其中显示了you向cur中添加以下内容的位置