17

我正在 Rails 中创建 REST 服务。这是我的路线。

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

我能够 [GET] 我的用户。我正在尝试更新我的用户,但出现错误:

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 调用吗?谢谢。

4

4 回答 4

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

would also be a possible route if placed before the other routes.

于 2014-08-26T17:18:52.530 回答
5

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

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

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

于 2015-05-07T01:12:56.450 回答
3

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

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

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

于 2013-01-26T20:48:26.947 回答
0

如果您使用 javascript 的 ajax 调用遇到此问题,您可能会遇到跨站点问题。(例如,您的浏览器当前的 url 是 :http://a.xx.com并且 ajax 向 发送请求http://b.xx.com),然后 Rails / other-backend-server 将得到这种OPTIONS请求。

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

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

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

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

参考:AXIOS 请求方法更改为 'OPTIONS' 而不是 'GET'

于 2022-02-03T07:10:04.277 回答