【问题标题】:Rails implement an API using Routes pointing to existing controller actionsRails 使用指向现有控制器操作的 Routes 实现 API
【发布时间】:2012-06-23 17:34:55
【问题描述】:

我有一个 Rails 应用程序,它可以通过 HTML 界面完成我需要它做的所有事情,现在我想使用一个 API 来提供对部分功能的访问。

如何使用 Routes.rb 将某些 API 控制器操作选择性地转发到另一个控制器的操作?

我尝试了以下方法:

我的常规控制器路由可以正常使用:

match 'stuff' => 'stuff#index'
get 'stuff/index'
get 'stuff/some_get_action'
post 'stuff/some_post_action'

但是当我尝试使用我的 API 时:

match 'api' => 'api#index'
match 'api/some_get_action' => 'stuff#some_get_action', :via => :get
match 'api/some_post_action' => 'stuff#some_post_action', :via => :post

或者...

match 'api' => 'api#index'
get 'api/some_get_action', :to => 'stuff#some_get_action'
post 'api/some_post_action', :to => 'stuff#some_post_action'

我得到一个错误。当我导航到 /api/index 以服务器包含用于测试 API URL 的表单的 HTML 页面时,url_for 会引发“路由错误”异常,提示“没有路由匹配...”。

【问题讨论】:

  • 如果你想在你的应用程序上使用 API,你应该坚持最佳实践:引入 app/v1 等版本控制并为其创建不同的控制器。如果你坚持使用胖模型瘦控制器方法,这应该很容易做到。

标签: ruby-on-rails routes


【解决方案1】:

您可能希望包含 ':as => ' 并定义您可能用作链接路径的路由名称。

get 'api/some_get_action' => 'stuff#some_get_action', :as => 'some_get_action'

并且您的索引文件中的链接路径将包含“some_get_action_path”。不确定 'match' 或 'get' 是否会自动解析为路径名,通过设置 ':as' 肯定会。

我喜欢您设置此页面进行测试的想法。我总是在控制台中做这件事,这肯定比简单地点击一个链接更难。您的链接可能需要推断它们是 :json 请求,而不是 :http。

【讨论】:

  • 我正在使用 'api', :action => 'some_get_action' %>。所以我不认为 _path 辅助方法有问题。
  • 你的意思可能是 。不知道为什么它不工作。如果您确实更改了我上面的“获取...”,它也可能会起作用,并且更容易,因为您只需要“link_to some_get_action_path”。
  • 感谢 Cole,您使用辅助方法的建议奏效了(我没有打扰 :as)。这似乎是 url_for 中的错误?我希望它与 _path 辅助方法一样,我更喜欢 url_for 更明确地说明您指向的控制器/动作,而不是魔术路径方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2023-03-22
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多