我正在尝试从零编程经验中学习rails并且有一个我试图制作的应用程序。在这里的人们的帮助下,我有一个场地的索引页面,可以通过下拉菜单过滤它们所属的区域。我希望能够产生相同的效果,但使用复选框,并且还能够选择多个区域添加到过滤器。这就是我到目前为止所做的:
型号:
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中的第一个表单(下拉列表)工作正常,但复选框(第二个表单)返回“无法将符号转换为整数”,我错过了什么/做错了什么?
谢谢你的帮助。
答案 0 :(得分:8)
我不确切知道是什么导致了您的错误,但我可以告诉您check_box_tag
帮助程序没有按照您期望的方式工作。从the documentation开始,它的定义如下:
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) []
。这使得Rails可以将使用此名称提交的所有值收集到一个数组中,而不是仅仅使用最后一个。见下文:扔掉网址......
/whatever?a=3&a=17&a=12
...在Rails应用程序中为您提供了参数哈希...
{: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 =&gt; nil},Rails会找到所有没有area_id的场地 - 可能没有,绝对不是你想要的。
希望这有帮助!
答案 1 :(得分:0)
在你对Area.find的调用中,你提供了参数:all。在我假设您正在使用的Rails 3中不推荐使用此语法。以前使用find(:all,...)或find(:first,...)等的所有用法都不能再使用了。相反,你应该像第一种形式一样使用它:Area.all(...)
作为旁注,看起来check_box_tag参数可能也是错误的。我猜你应该发送a.name而不是“name”。
以下是我认为有效的修改后的表格:
<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>