gpt4 book ai didi

ruby-on-rails - 使用复选框过滤记录

转载 作者:行者123 更新时间:2023-12-04 17:58:00 25 4
gpt4 key购买 nike

我正在尝试从零编程经验中学习 Rails,并有一个我正在尝试制作的应用程序。在人们的大力帮助下,我有一个 field 索引页面,可以通过下拉菜单按它们所属的区域进行过滤。我希望能够具有相同的效果,但使用复选框并能够选择多个区域以添加到过滤器。这是我到目前为止:

模型 :

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

Controller :
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

field 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 helper 没有按照您期望的方式工作。来自 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" />多次。请注意,“值”属性(即提交该表单时发送到您的服务器的值)始终是“名称” - 不是您想要的!

相反,请尝试以下操作:
<% 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 的数组,你可以在一个单行中获得所有这些区域中的所有 field (Rails 不是很好吗?):
    filtered_venues = Venue.all(:conditions => {:area_id => params[:areas]})

    在调用该查找器之前,请确保您有一个有效的区域 ID 数组 - 如果没有,您的条件散列将评估为 {:area_id => nil},Rails 会为您找到所有没有的场馆area_id - 可能没有,绝对不是你想要的。

    希望这可以帮助!

    关于ruby-on-rails - 使用复选框过滤记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4869679/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com