【发布时间】:2019-01-27 00:26:04
【问题描述】:
所以在我的视图顶部,我创建了一个小表单,让用户选择一个学期和一个领域:
<%= form_tag '', :method => :get do %>
<%= collection_select(:semester, :semester_id, Semester.all, :id, :name, prompt: true) %>
<%= collection_select(:field, :field_id, Field.all, :id, :name, prompt: true) %>
<%= submit_tag 'Filter' %>
<% end %>
然后页面会根据这个“过滤器”生成显示不同链接的主题。现在为此我在控制器中使用以下声明:
@betterFilteredLinks = Link.where("semester_id = #{params[:semester][:semester_id].to_i} AND field_id = #{params[:semester][:semester_id].to_i}")
如果我加载应用了过滤器的页面,这一切正常:
http://0.0.0.0:3000/?utf8=✓&semester%5Bsemester_id%5D=2&field%5Bfield_id%5D=1&commit=Filter
但是,如果我只加载http://0.0.0.0:3000/,它会(自然)将过滤器的参数设置为nil,页面将显示错误。
我想不出解决办法,也不知道该去哪里找。我读到我不应该为参数设置默认值?这可能吗?
除了使用已经预定义的参数进入视图之外,还有其他方法可以解决这个问题吗?我相信我在这里可能做错了什么,但我今天刚刚了解了表单和参数..
提前致谢:)
【问题讨论】:
-
您喜欢在不带参数的情况下输入 URL 时的“正确” 行为是什么?这不是一个技巧问题。行为可以是任何东西(明智的),但我不知道如何在不知道所需行为的情况下回答您的问题。
-
例如,它可能是: 有意义的错误消息(不仅仅是“哎呀,出了点问题!”);或重定向到另一个页面;或者默认为某个
semester_id(基于什么逻辑?);或 全部显示 - 即不按学期过滤; ... -
使用
dig就像params.dig(:semester, :semester_id)。但是nil.to_i给了你0,不确定你是否想要。我不建议在 Controller 中进行过滤,也许可以创建一个名为GradeFilter的新类,或者给它一个合适的名称。也许根据参数是否存在来构建您的查询,例如@betterFilteredLinks = Link.order(:semester_id),@betterFilteredLinks.where(semester_id: semester_id) if semester_id,您首先必须在您的班级中设置semester_id(您可以使用dig),或将params[:semester]传递给您的新课,嗯,方法很多。 -
@TomLord 哦,是的,没有选择过滤器的正确行为应该是网站上没有显示任何内容。页面上的部分将根据选择的过滤器组合生成。例如,有人选择了第 1 学期,因此只显示有 term_id 1 的部分。因此,如果没有应用过滤器,页面将只显示标题。
-
@fanta 根据参数是否存在来构建查询正是我想要做的!我只是不知道如何用这样的话来表达!谢谢! :) 我明天要尝试挖掘并报告!
标签: html ruby-on-rails ruby forms filter