我正在开发一个项目,用户可以通过一个简单的表单上传视频,另外通过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请求...
那么我该如何解决这个问题呢?
答案 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