2011-01-26 74 views
1

我超級新的節目和我堅持......再次,篩選顯示的記錄通過表單輸入

我使用的是軌道3,目前有每個場館都屬於一個區域和類型場地模型(每個都是他們自己的模型)數據庫中的所有場館都顯示在顯示場地名稱及其區域和類型的分區中的索引頁面上。

我該如何去處理在索引頁上有2個下拉列表(區域和類型)的表單,該表單根據下拉列表中選擇的內容過濾顯示的地點記錄。例如選擇類型爲酒吧,曼徹斯特爲區域,僅顯示曼徹斯特的酒吧或選擇酒吧作爲類型,全部爲區域,並顯示來自所有區域的所有酒吧。

我已經嘗試安裝sphinx和thinking_sphinx,但似乎無法讓他們在我的Windows 7上工作。我得到了服務啓動時發生的1067錯誤以及「無法啓動searchd守護進程」。從think_sphinx開始,我認爲這個服務沒有運行,所以我希望這個答案不會涉及到獅身人面像。

我看了一下示波器,想到這可能是要走的路嗎?雖然我還沒有第一個想法如何包含下拉列表來選擇所需的範圍,或者確實如何編寫滿足我想要的過濾器類型的範圍。

非常感謝您的幫助,非常感謝!

回答

0

您可以通過多種方式完成此操作,具體取決於您要如何過濾。最好的做法是將過濾器構建爲.find(:conditions => ...)調用,並讓數據庫完成工作。如果您事先不知道要過濾哪些參數,那麼在代碼中執行操作會更容易但效率更低。假設你有搜索參數venue_areavenue_type,你可以做這樣的事情在控制器:

def index 
    @venues = Venue.all # Or whatever criteria you might have here 
    @venues = @venues.select { |v| v.area_id == params[:venue_area] } if !params[:venue_area].blank? 
    @venues = @venues.select { |v| v.type_id == params[:venue_type] } if !params[:venue_type].blank? 
    ... 
end 

然後,您可以創建一個包含所有類型和區域ID下拉菜單:在搜索表單的。您可以使用幾個助手,例如select_tag。該@options將在控制器當然,更好的人口,但是這顯示了關係更加清晰:

<form method="get"> 
<% @options = Area.all.map { |a| [ a.name, a.id ] } %> 
<%= select_tag("venue_area", options_for_select(@options)) %> 
<input type="submit" value="Filter" /> 
</form> 
+0

謝謝您的回答,在下拉菜單只是顯示我的領域和類型的記錄,因爲我想,但我不知道到底是什麼你的意思是通過GET請求來索引。 – Dave 2011-01-27 01:11:55

0

這種類型的過濾可以在JavaScript,Ruby或兩者中完成。

如果HTML本身包含所有元數據,您需要確定哪些項目匹配哪些過濾器,那麼可以通過隱藏和顯示元素來完成JavaScript中的操作,以響應表單中的更改。

如果用戶需要點擊一個提交按鈕來讓他們選擇的過濾器生效,那麼表單可以簡單地提交,並且可以使用Rails在後端重新填充表單。

如果HTML沒有所有的元數據,並且你不希望他們必須提交表單,那麼可以使用AJAX將所選過濾器發送到後端,讓Rails構造新表單併發送它返回到客戶端,然後使用JavaScript更新前端。

您可能會從Railscasts集Search, Sort, Paginate with AJAX中得到一些想法。這不完全是你的情況,但它可能會指示你在這些類型的操作如何工作的正確方向。

1

在你的控制器,你應該能夠做,因爲簡單的東西:

@filtered_venues = Venue.where(:area => params[:venue][:area], :type => params[:venue][:type]).all 

這應該給你你想要的篩選結果。

然後在你看來,你應該能夠使用的形式助手創建選擇元素:

select("venue", "area", ['New York', 'London', 'Amsterdam'], {}, { :prompt => 'Select Area' }) 
select("venue", "type", ['Pub', 'Outdoor', 'Hall'], {}, { :prompt => 'Select Type' }) 

應該輸出類似:

<select name="venue[area]"> 
    <option value="">Select Area</option> 
    <option value="New York">New York</option> 
    <option value="London">London</option> 
    <option value="Amsterdam">Amsterdam</option> 
    </select> 
    <select name="venue[:type]"> 
    <option value="">Select Type</option> 
    <option value="Pub">Pub</option> 
    <option value="Outdoor">Outdoor</option> 
    <option value="Hall">Hall</option> 
    </select> 

有很多其他的方法來如果您的區域或類型已準備好收藏,請動態獲取選項。請查看以下信息以獲取更多信息:http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html