Rails 3:如何获得没有ID的自定义restful成员路由

时间:2013-03-15 13:18:12

标签: ruby-on-rails-3 routes

我正在开发一个项目,用户可以通过一个简单的表单上传视频,另外通过FTP上传到某个目录,然后只需从FTP目录中选择文件,而不是通过表单上传。

我得到了以下videos_controller的标准设置:

# routes.rb
resources :videos

# new.html.rb
form_for(@video) do |f|
  ...
end

控制器中的其他操作都是有效的,只是标准行为。上传工作,这不是问题。问题是如果我执行以下操作:

# routes.rb
resources :videos do
  member do
    post :from_ftp
  end
end

# new.html.rb
form_for(@video, :url => from_ftp_video_url) do |f|
  ...
end

我收到错误:No route matches {:action=>"from_ftp", :controller=>"videos"},因为生成的路径如下所示:

from_ftp_video POST   /videos/:id/from_ftp(.:format)        videos#from_ftp

这似乎是正确的,因为它是成员路线。但我不需要URL的:id部分,因为我正在创建一个新的Video对象,而不是通过表单,而只是使用FTP目录中的文件...所以它基本上是另一个{ {1}}动作,这就是为什么我想将其作为POST请求...

那么我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:11)

了解成员和收集路线的方法是:

  • 会员路由会对您拥有的对象执行某些操作。
  • 集合路由对所有对象的集合执行某些操作。

因此,当我们考虑create路线是什么时,它是集合路线,因为它正在为集合添加新对象!

因此,您的from_ftp方法也应该是集合路由,因为它是添加到集合

此外,您可能需要考虑是否可以在现有create方法中使用FTP功能 - 它可能更整洁。

答案 1 :(得分:8)

虽然选择的答案对于Vapire的情况是正确的,但它不一定回答标题问题。如果您来到这里寻找如何在没有ID的情况下获取成员操作,因为您不需要ID,答案会有所不同。

假设您实施了设置current_user的身份验证。您只允许用户编辑自己的个人资料。在这种情况下users/:id/edit没有意义,因为:id由current_user方法决定。在这种情况下,/users/edit更有意义。

您可以更改routes.rb文件以创建路径中没有id的成员操作。

......而不是......

resources :user

...使用此(注意多个资源)......

resource :user