2011-02-02 156 views
5

我想學習從零編程經驗的鐵軌,並有一個應用程序即時嘗試。在這裏有很多人的幫助下,我有一個可以通過下拉菜單選擇哪個區域的過濾器的索引頁面。我希望能夠產生相同的效果,但使用複選框,並且還可以選擇多個區域添加到過濾器。這是我到目前爲止有:使用複選框來過濾記錄

型號:

class Venue < ActiveRecord::Base 
    belongs_to :user 
    has_many :reviews 
    belongs_to :area 

    scope :north, where(:area_id => "2") 
    scope :west, where(:area_id => "3") 
    scope :south, where(:area_id => "4") 
end 

控制器:

def index 
    if (params[:area] && Area.all.collect(&:name).include?(params[:area][:name])) 
    @venues = Venue.send(params[:area][:name].downcase) 
    else 
    @venues = Venue.all 
    end 
end 

場地index.html.erb:

<div class="filter_options_container"> 

    <form class="filter_form", method="get"> 
    <%= select("area", "name", Area.all.collect(&:name), {:prompt => 'All Areas'}) %><br> 
    <input type="submit" value="Filter" /> 
    </form> 

    <br><br> 

    <form class="filter_form", method="get"> 
    <% Area.find(:all).each do |a| %> 
     <%= check_box_tag("area", "name") %> 
     <%= a.name %> 
    <% end %> 
    <input type="submit" value="Filter" /> 
    </form> 
</div> 

<div class="venue_partials_container"> 
    <%= render :partial => 'venue', :collection => @venues %> 
    <div class="clearall"></div> 
    <%= link_to 'add a new venue', new_venue_path, :class => "add_new_venue_button" %> 
</div> 

第一種形式(下拉式菜單)在filter_options_container工作正常,但複選框(第二種形式)返回「無法將符號轉換爲整數「我錯過了什麼/做錯了什麼?

謝謝任何​​幫助。

回答

8

我不知道到底是什麼導致你的錯誤,但我可以告訴你,助手不工作,你期望的方式至。從the documentation,它的定義是這樣的:

check_box_tag(name, value = "1", checked = false, options = {}) 

所以調用check_box_tag("area", "name")反覆只會給你多次。請注意,「值」屬性(即在提交表單時發送到您的服務器的值)始終是「名稱」 - 不是您想要的!

相反,請嘗試以下操作:我已經改變了

<% Area.all.each do |a| %> 
    <%= check_box_tag("areas[]", a.id) %> 
    <%=h a.name %> 
<% end %> 

的事情:

  1. 我用Area.all代替Area.find(:all) - 我是做美容的原因,但DanneManne的回答聲稱它已經過時在Rails 3中(我不知道 - 我仍然在2.3.8)。
  2. 我在值字段中使用了區域的ID而不是名稱;如果可以的話,通過ID查找事物總是很好的--ID是整數,並且比字符串的比較速度更快,並且數據庫中的id列上總是會有一個索引,用於超快速查找。
  3. 最後,但方式最重要我投入[]後輸入名稱。這讓Rails將所有使用此名稱提交的值都收集到一個數組中,而不僅僅是最後一個。請看下圖:

投擲網址...

/whatever?a=3&a=17&a=12 

...在Rails應用程序讓你params哈希表...

{:a => 12} 

...但網址...

/whatever?a[]=3&a[]=17&a[]=12 

...給你想要的東西:

{:a => [3, 17, 12]} 

如果你有所有你感興趣的area_ids的數組,你可以得到所有處於場館在一個班輪這些領域的任何(是不是Rails的偉大?) :

filtered_venues = Venue.all(:conditions => {:area_id => params[:areas]}) 

只要確保你有區域ID的一個有效的數組調用該取景器之前 - 如果你不這樣做,你的條件哈希將評估爲{:AREA_ID =>零},並且Rails'll找到你所有沒有area_id的場所 - 可能都沒有,並且絕對不是你想要的。

希望這會有所幫助!

+0

謝謝非常好的答案它的工作! – Dave 2011-02-03 20:40:01

0

在您對Area.find的調用中,您提供了參數:all。這個語法在我假定你正在使用的Rails 3中被棄用。 find(:all,...)或find(:first,...)等所有以前的用法不能再使用。相反,您應該像第一種形式一樣使用它:Area.all(...)

作爲一個附註,它也看起來像check_box_tag參數可能是錯誤的。我想你應該發送一個。名稱而不是「名稱」。

這裏是一個修改的形式,我認爲作品:

<form class="filter_form", method="get"> 
    <% Area.all.each do |a| %> 
    <%= check_box_tag("area", a.name) %> 
    <%= a.name %> 
    <% end %> 
    <input type="submit" value="Filter" /> 
</form>