7

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

我得到了以下非常标准的 a 设置videos_controller

# routes.rb
resources :videos

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

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

# 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

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

那么我该如何以最好的方式解决这个问题呢?

4

2 回答 2

17

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

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

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

...而不是这个...

resources :user

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

resource :user
于 2014-05-14T19:39:55.053 回答
13

理解成员和集合路由的方法是这样的:

  • 成员路由对您拥有的对象执行某些操作。
  • 集合路由对所有对象的集合做一些事情。

所以当我们考虑create路由是什么时,它是一个集合路由,因为它向集合添加了一个新对象!

所以你的from_ftp方法也应该是一个集合路线,因为它正在添加到集合中。

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

于 2013-03-15T16:43:45.323 回答