2009-09-09 60 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