2009-09-09 59 views
0

我其实有两个问题。我已经阅读了Rails指南和其他一些文章,但是我一直无法将我所读的内容翻译成工作路线。我有一个应用程序,允许从几个不同的上下文中上传图像。我想的URI来表达正确的上下文,以便下面的URI访问相同的页面:了解轨道中的路线

/images/upload 
/photos/upload 

在这个例子中,我已经覆盖了new_image_path使用upload用于描述的目的。我有覆盖工作,但使用:as将图像映射到照片只出现一种方式(使用:as => 'photos'/images路由不起作用)。有没有办法让多条路线指向同一个地方?

我也有几种不同的方式来上传图片/照片/等。标准方法,每个表单使用一个图像或批处理方法,用户上传压缩文件并提取压缩文件并保存其每个图像。

看起来像这样做的最有语义的方式是通过向URI添加处理程序组件(例如/images/upload/batch),但我不知道如何处理此问题。默认的路径路径对于图像只需要的东西来说似乎很普通,但我也不希望对整个位的命名路由如此具体。什么是做这种事的最好方法?

谢谢。

更新:基于jonnii的回答我的第一个问题,我已经添加了以下到我的routes.rb文件:

map.resources :images, :path_names => { :new => 'upload' } 
map.resources :photos, :controller => 'Images', :path_names => { :new => 'upload' } 

这似乎这样的伎俩让我用/images//photos/可互换。

+0

眼看'routes.rb'你已经有将帮助诊断。我还建议您在更改时自由使用'rake routes'。 – 2009-09-09 19:07:21

回答

1

我假设你正在使用的资源做你的照片的路线:

map.resources :photos 

如果这是你应该能够定义指向同一个控制器作为照片资源的第二资源的情况下:

map.resources :uploads, :controller => 'PhotosController' 

我没有测试过这一点,但我不明白为什么这样的事情会不会工作。


问题2:

有几种不同的方法可以批量上传,我认为最好的方法是拥有一个单独的资源,因为您很可能将拥有不同的UI。例如,您可能会这样做:

map.resources :batch_uploads 

如果您要将批量上传视为​​zip,那么这可能就足够了。

一个稍微复杂一点的选项,但利用了rails的细节(让老实说,谁不想利用这个??)是嵌套的子窗体和accepts_nested_attributes_for。如果您想允许用户在时间上将多个图像附加到表单,这将非常有用。

例如,如果你的模式是这样的:

class User < AR:B 
    has_many :photos 
end 

你可能有这样的路线:

map.resources :users do |u| 
    u.resources :photos, :collection => {:get => :new_batch, :post => create_batch} 
end 

在你new_batch视图,您将有一个form_for @useruser_form.fields_for :photos。你可以使用ajax添加一个新的表单,并一次性发布。

如果你想保持相同的语义,你现在并没有想添加更多的路线,你可以扩展你的模型做不同的基础上,正在上传什么东西的文件名。

例如,如果你使用的回形针的附件,你可以停止处理附件如果文件名.zip文件结束(此代码不能保证正常工作,我从内存中这样做):

def is_zip? 
    attachment.filename.ends_with?('.zip') 
end 

before_attachment_process do |attachment| 
    false if is_zip? 
end 

before_filter :process_bulk_attachment, :if => :is_zip? 
def process_bulk_attachment 
    ... extract the zip and save each image in it ... 
    false 
end 

这就是它的模型的一部分。你应该始终瞄准肥胖模型和瘦身控制器!

我希望这给你的一些想法和/或指向您在正确的方向。

+0

你是对的,我完全错过了Rails指南。地狱,指南的例子甚至是我需要的_exact_。我已经将答案标记为1,但除非第二个问题得到解答,否则我不想标记答案。真的很感谢你的帮助。我已经更新了我原来的问题,以及如何应用您的答案。 – 2009-09-10 00:22:40

+0

这是一个总的母马= =)希望它是有用的! – jonnii 2009-09-10 00:47:17

+0

哇。对于看起来像一个简单的操作,这是一个很多代码的地狱(尽管我非常欣赏这一努力:-)。我真正想要的是能够调用/ images/upload/batch,并使用可以转发的“批量”参数调用ImagesController :: new,以便我可以稍微修改默认格式部分。有没有比这更简单的方法? – 2009-09-10 19:35:39

0

我已经得到一点点接近到什么我要去为我:

map.resources :images, :path_names => { :new => 'upload' } 
map.resources :images, :new => { :batch => :get } 

前者允许我使用的/images/upload代替/images/new,如图jonnii的回答我的第一个问题。后者可以让我通过/images/new/batch这就要求ImagesController#batch指定“新”功能的第二条路线。我希望能够使用/images/upload/batch,但这可能要做。

很显然,我还有很长的路要走我真正了解Rails的路由。 jonnii,如果我只是重复你已经说过的部分内容,我很抱歉。我可能说不知道就多你的答案回答问题2