2013-01-09 24 views
0

REST風格的目的,我做我的路由就像這樣:我應該如何使這個路由RESTful?

的routes.rb

match 'shops/:sort/:genre/:area', :to => 'shops#index' 

但如果流派是空的呢? 是不是會重定向到example.com/shops/newest_first//california

我該如何解決這種路由和參數問題? 任何人都可以給我看一個很好的例子嗎?

視圖

<%= form_tag shops_path, :method => :get do %> 
    <%= select_tag :sort, options_from_collection_for_select(Sort.all, 'id', 'name', params[:sort]), :prompt => "Newest first" %> 
    <%= select_tag :genre, options_from_collection_for_select(Genre.all, 'id', 'name', params[:genre]), :prompt => "all" %> 
    <%= select_tag :area, options_from_collection_for_select(Area.all, 'id', 'name', params[:area]), :prompt => "all" %> 
<% end %> 

別論

+0

你的路線是**不** ** REST-ful。我想你誤解了這意味着什麼。此外,提交您的表單不會生成一個匹配您的路線的網址** ever **。相反,如果您的選擇列表包含空白選項,它將指向'/ shops?sort = ...&genre = ...&area = ...',並且是'...'可能對任何一個都是空白的。如果你正在做'GET'表單提交,它總是會產生一個查詢字符串,這部分是因爲你提出的問題,你想用你的路線做什麼不是最好的主意。 – deefour

+0

我會說只是驗證你的表單,該參數永遠不會丟失。或者設置一個缺省值。你可以用這種方式來構建它,但是我同意來自「Erez Rabih」的答案,因爲參數是更常見的方式 –

+0

謝謝你們。你認爲Erez的答案是什麼?你們會做同樣的事嗎? – Foo

回答

2

而寧靜的路由是最直觀,最傳統的,它並不總是符合我們的需求。

在你的情況下,我會建議使用查詢參數,而不是嚴格的寧靜路線。

example.com/shops將獲得3查詢參數:sortgenrearea,所以URL可能看起來像example.com/shops?area=california&sort=newest_first

的索引操作,您控制器,你可以查詢以下方式這些參數的存在:

def index 
    if !params[:sort].blank? 
    @shops = @shops.sort(params[:sort]) 
    end 
    if !params[:area].blank? 
    @shops = @shops.where(:area => params[:area]) 
    end 
    . 
    . 
    . 
end 

這種方式可以很好地保護您的控制器不會丟失參數,但您仍然可以提供用戶請求的任何數據。

附註:請務必檢查您使用的params散列值是否只包含您願意接受的值。

+0

非常感謝。在我的情況下,所以我不需要按照我的方式?對於搜索引擎優化的目的,我認爲你的戰爭對谷歌搜索引擎更好,因爲他們可以判斷它的參數。但如果我按照自己的方式行事,谷歌搜索引擎可能會誤解他們是不同的頁面。所以在我的情況下,你的方式是最好的解決方案。對? – Foo

+0

在我看來,是的,你可能會在這裏得到另一個可能更好的答案。 –

+0

非常感謝。這很有幫助! – Foo