你如何在 Rails 中路由 [选项]



我正在用Rails做一个REST服务。 这是我的路线。

  resources :users
  match '/users', :controller => 'users', :action => 'options', :constraints => {:method => 'OPTIONS'}

我能够[获取]我的用户。 我正在尝试更新我的用户,但收到错误:

ActionController::RoutingError (No route matches [OPTIONS] "/users/1"):

当我跑rake routes这里是给我的路线:

    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
                 /users(.:format)          users#options {:method=>"OPTIONS"}

有人可以告诉我如何修复我的路由,以便我可以进行任何类型的 REST 调用吗? 谢谢。

match '/users' => "users#options", via: :options

如果放置在其他路线之前,也将是可能的路线。

如果您不想为 /users/users/id 创建两个额外的路由,您可以这样做:

match 'users(/:id)' => 'users#options', via: [:options]

在这种情况下,id成为可选的,/users/users/id都将响应同一路由。

我无法路由请求的原因是我的match中没有用户 ID。 我添加了这一行:

match '/users/:id', :controller => 'users', :action => 'options', :constraints => {:method => 'OPTIONS'}

现在我可以路由我所有的 GET 请求。

如果你在使用javascript的ajax调用时遇到了这个问题,你可能会遇到跨站点问题。(例如,你的浏览器的当前网址是:http://a.xx.com并且ajax向http://b.xx.com发送请求),那么Rails/其他后端服务器将获得这种OPTIONS请求。

为了避免这种情况,除了更改ruby代码外,我建议您执行以下两种解决方案之一:

  1. 使用以下方法添加 CORS 支持: https://github.com/cyu/rack-cors,代码行就可以工作了。

  2. 将所有请求发送到a.xx.com,然后更改Nginx的配置,将这些请求重定向到b.xx.com

顺便说一句,我不建议您更改routes.rb文件以支持选项请求。这会弄乱你的代码。

请参阅:AXIOS 请求方法更改为"选项"而不是"GET"

相关内容

  • 没有找到相关文章

最新更新