2012-03-23 41 views
3

所以,我對Rails很陌生,仍然按照原理工作。我想像大多數人一樣,我已經開始創建這個基本的CRUD。好的。完成。在ReSTful導軌模型中的搜索動作

現在我想要一個新的操作:搜索。事實證明,這不是七個休息神聖(!)行動之一(如果它是正確的)。雖然我知道我可以實施新的自定義操作併爲其提供資源,但我在幾個地方閱讀,儘可能長時間地堅持標準操作。好的。什麼是正確的方法?

再次像this guy幾個來源建議思考我的場景在名詞的溫度,似乎我需要一個「搜索」控制器...?它只是沒有說服我,我必須創建一個全班,而我通常會做def search只是爲了保持ResTful。

我得到了什麼問題?這裏常見的解決方案是什麼?

謝謝。

+0

你說的是全文搜索還是db記錄搜索? – clemensp 2012-03-23 17:11:08

+0

在這一點上只是一個記錄查詢:) – filippo 2012-03-24 19:31:57

回答

4

這取決於您的搜索是針對一種資源還是多種資源。例如,如果您有一個ProductsController,並且只想爲您的產品實現搜索功能,則可以創建一個名爲「搜索」的收集操作(url將爲/ products/search)

如果您的搜索適用於多個資源,我會使用單例資源創建一個SearchesController:在我的路由文件中搜索。

然後再次,當您在應用程序中實現搜索功能時,請不要將所有邏輯放在控制器中,而要創建模型類來處理您的搜索。您甚至可以創建抽象類來映射到搜索表單,從而避免使用'* _tag'字段來創建搜索表單。

參見:https://github.com/slainer68/basic_active_model

4

REST是一個概念,而不是宗教:-)。但核心動詞是映射到其關聯的HTTP動詞的GET/POST/PUT/DELETE。 URL中的內容通常反映了這一點,並且(這是更多的Rails哲學)遵循約定可以使一切變得更加容易。您使用通用導軌(例如腳手架)獲得的URL在多個方面不是特別理想,但它們可以工作,您可以更改它們。

所以,是的,搜索(假設它開始簡單的,例如,在一個單一的模式查找記錄,說Product),那麼你可以做一個GET與查詢字符串這樣

def search 
    @results = Product.where("name ILIKE ?", params[:query]) 
    ... 
end 

這將導致像/product/search?query="foo"這樣的URL--沒有什麼錯。

3

如果你想堅持REST(這是一個指針真的,它有優點和缺點),那麼你鏈接到SlideShare上被推薦做事情的正確方法。

因此,例如,如果您有一個comments_controller,並且您希望能夠搜索註釋,則可以創建一個comments_search_controller。搜索表單將在comments_search_controller#new,這將POST到comments_search_controller#create。

是的,你正在創建另一個這樣做的類,但這與在comments_controller中創建另一個動作並沒有多大區別,它確保了事物的一致性和分離性。你不需要一個新的CommentSearch模型或任何東西,只是該控制器,它會要求你的評論模型的相關搜索結果。