型号:
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中的第一个表单(下拉列表)工作正常,但复选框(第二个表单)返回“无法将符号转换为整数”,我错过了什么/做错了什么?
感谢您的任何帮助.
解决方法
check_Box_tag(name,value = "1",checked = false,options = {})
因此,重复调用check_Box_tag(“area”,“name”)只会给你< input id =“area”name =“area”type =“checkBox”value =“name”/>多次.请注意,“value”属性(在提交该表单时发送到您的服务器的值)始终是“名称” – 不是您想要的!
相反,请尝试以下方法:
<% Area.all.each do |a| %> <%= check_Box_tag("areas[]",a.id) %> <%=h a.name %> <% end %>
我改变的事情:
>我使用了Area.all而不是Area.find(:all) – 我是出于美观原因而做的,但是DanneManne的回答声称它在Rails 3中已经过时了(我不知道 – 我仍然在2.3.8).
>我在值字段中使用了区域的ID而不是其名称;如果可以的话,通过ID查找内容总是好的–ID是整数,并且比字符串更快地比较,并且数据库中的id列总会有一个索引用于超快速查找.
>最后,但最重要的是,我在输入名称之后输入了[].这使得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 => nil},Rails会找到你所有没有area_id的场地 – 可能没有,绝对不是你想要的.
希望这可以帮助!