2009-10-12 84 views
3

這似乎是一個的n00b問題,但我想打破一些,我可能已經使用MVC採納我的不好的做法,所以我希望你能幫助我非CRUD控制器動作

所以,想象我想做一些類似於「上傳CSV並解析它」的東西,我覺得它不適合CRUD模式......我沒有與數據庫交互,所以我不需要添加或更新或刪除,但我仍然希望能夠從不同的角度以有意義的方式使用該操作。因此,只需一個名爲「UploadCSV」的操作即可,並且可通過URL訪問,如「/ data/uploadcsv」

您的想法非常感謝!

湯姆

回答

1

這聽起來像你正在談論RESTful的想法(有行動稱爲索引,創建新的,編輯,更新,銷燬顯示)。

在MVC中,你可以在任何你想要的地方調用一個動作(所以是的,你可以稱它爲uploadcsv,如果你願意的話)。如果您希望它適合RESTful原則,您可能需要考慮動作的作用(例如數據上傳本質上是創建或更新功能),並使用其中一個RESTful動作名稱命名它。

+0

Michael, 我認爲你提出的問題(「它本質上是一個創建還是更新函數」)的含糊性是真正挑戰我的。我想,我可以想象,「上傳CSV」的操作正在更新假設的「此用戶的已上傳的數據」,並因此成爲我的控制器的上下文。思考的食物!如果你有任何具體的例子,他們會對我很有幫助。 再次感謝。 – thoswarner 2009-10-12 14:56:22

+0

將RESTful名稱概念化可能會非常棘手(我當然不是專家)。我相信這一點在鐵軌世界中很熟悉。用戶登錄到一個網站,他們正在創建一個會話。通常使用RESTful/session/create來登錄用戶,相應地/ session/destroy用於註銷。這與CRUD無關。更令人困惑的是,你可以在rails和mvc中使用這些操作,以便/ login和/ logout實際上只是對/ session/create和/ session/destroy的引用。 – 2009-10-12 15:06:42

+1

在創建vs更新的情況下。我(再次沒有專家)問自己:「我是否已經獲得了這些信息/資源?」如果不是,這是一個創造,如果是這樣,那麼這是一個更新。使用會話/創建示例:我有一個用戶,但在登錄之前,他們在應用程序上沒有活動會話。因此,我沒有使用活動會話的用戶概念,所以它的會話/創建不會話/更新。 – 2009-10-12 15:11:25

0

資源的持久性在這裏並不重要。我想你在這裏做的是 - 從提供的csv中創建某種資源(儘管不是持久的)。這裏的東西是想想這個csv文件代表什麼。裏面有什麼?它是否會成爲系統中的資源集合,還是它只是表示系統中的一個對象?如果你仔細想想它必須是具體的東西。你能更具體地瞭解你的問題領域嗎?

+0

感謝您的回覆!保留CSV解析示例 - 因此,讓我們假設我上傳一個CSV文件,其中包含一個標題行字段,然後是任意數據。然後,我想抓取所有標題並將其呈現給用戶,以便他們可以在實際導入數據之前選擇其字段(導入架構不明確,並且可能因源數據而異)。這是我需要做出決定的地方,「我應該怎樣命名我的控制器?」,「我應該使用什麼操作來處理初始上傳視圖」以及「我應該使用什麼操作來處理實際上傳和解析CSV的操作」 .. – thoswarner 2009-10-12 15:08:10

+0

我的問題仍然是 - 此csv是否只包含一種特定類型的數據(表示應用程序中的某種對象)?或者它真的是武斷的?我的意思是 - 你(最後)會從這個文件中只填充一種資源,還是會有所不同? – 2009-10-12 15:18:41

+0

在回答你的問題時,數據本身並不代表系統中的資源(汽車列表,用戶名等),因爲它可以是任何東西。但是,即使實際數據字段沒有直接反映原始數據源,數據也是任意的,仍然適合存儲資源。因此,你在那裏是正確的! 因此,用您提供給我的方式思考它已經回答了我的問題!謝謝! – thoswarner 2009-10-12 15:23:42

0

我相信我和你有同樣的觀點。

在我的項目中,我儘可能地儘可能地保持寧靜。但是正如你說,有時一個特殊的情況下,只是不「適合」

畢竟這也是「感覺」 如果你提供了一個CSV導入功能,我認爲這是完全正確的不創建一個完整的REST問題實施CSV。

讓我們想象你的應用程序中你有客戶。而且你想給客戶選擇使用csv導入數據。您可以添加路由使用這個動作:

map.resources :clients, :member => { :uploadcsv => :get } 

這條路線是正確聲明,您的「客戶」資源完全是寧靜的,你有一個附加動作正確申報管理數據輸入。

我唯一的警告是:不要使用像這樣的路線「/ data/uploadcsv」。從我的角度來看,它缺乏清晰度。我喜歡能夠理解我的應用程序將要做什麼只是查看網址。而'/ data'對我來說太模糊:)