Ruby on rails 使用collection_select在活动记录中搜索-Rails 3.2.9

Ruby on rails 使用collection_select在活动记录中搜索-Rails 3.2.9,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,我只使用了一次collection_select来填充关联模型用户的国家/地区id。现在,我想在另一个视图上使用相同的collection_select语句搜索用户,并列出所选国家/地区的用户。我的尝试失败了。我可以在选择一个国家后查看该链接,并看到该国家的id已被选择。但当我单击“提交”按钮时,collection\u select语句会将选定值重置为默认选定值,并忽略选定值。例如,当我选择法国国家时,id为75。当我选择法国并单击“按国家搜索”时,id显示如下 http://localhos

我只使用了一次collection_select来填充关联模型用户的国家/地区id。现在,我想在另一个视图上使用相同的collection_select语句搜索用户,并列出所选国家/地区的用户。我的尝试失败了。我可以在选择一个国家后查看该链接,并看到该国家的id已被选择。但当我单击“提交”按钮时,collection\u select语句会将选定值重置为默认选定值,并忽略选定值。例如,当我选择法国国家时,id为75。当我选择法国并单击“按国家搜索”时,id显示如下

http://localhost:3000/users_admin?utf8=✓&query=&user%5Bcountry_id%5D=75
这是我有collection\u select语句的表单。我复制了在用户模型上添加/更新具有所选国家/地区id的记录时成功使用的语句。我希望我的逻辑是,当我选择一个国家/地区并单击“按国家/地区搜索”时,所选国家/地区在下拉列表中保持选中状态,并且具有所选国家/地区id的用户记录显示在屏幕上屏幕按名称搜索按预期工作

<%= form_tag users_admin_path, method: 'get' do %>
  <p style="padding-left: 20px;">
    <%= text_field_tag :query, params[:query], placeholder: "Search for first, last or full name" %>&nbsp;&nbsp;
    <span valign="center"><%= submit_tag "Search by Name", class: "btn btn-medium btn-custom", :name => nil %></span>&nbsp;&nbsp;&nbsp;&nbsp;
    <%= collection_select(:user, :country_id, Country.order('name'), :id, :name, {:selected => 233}) %>&nbsp;&nbsp;
    <span valign="center"><%= submit_tag "Search by Country", class: "btn btn-medium btn-custom", :name => nil %>
  </p>
<% end %>
我不确定问题是在于collection\u select语句的编码方式还是另一个逻辑问题。我的第一个想法是,我需要以某种方式保存collection\u select语句中的选定值,然后在where子句中使用它。但我不知道如何重新编码语句来实现这一点,并且在屏幕首次显示时,默认选择值为233,即美国。我还认为也许我应该有两种不同的形式,而不是一种。我只是不知道在这一点上我应该走的方向

我主要搜索了有关此问题的问题。大部分与collection_select相关的问题都与我可能永远不会使用它的用途有关。同样,我只使用了一次collection_语句:


如有任何帮助,我们将不胜感激。

当您使用表单中的模型时,即当您使用表单@user do,而不是表单标签时,应使用collection\u select

试着这样做:

<%= select_tag :country_id, options_from_collection_for_select(Country.all, :id, :title, params[:country_id]), include_blank: true %>
其中的params[:country_id]参数确保在用户提交搜索表单后,通过GET请求传入的任何国家/地区id都将在下拉列表中选择

顺便说一句,当涉及到模型的创建/更新时,使用表单_for。如果您正在创建搜索表单,则情况并非如此,您应该使用form_标记


阅读本文了解更多信息:

在进行了更多搜索之后,我决定在视图上显示参数,以查看散列中的内容。我的submit_标签中没有commit,所以我改为检查params[:country_id]是否存在。我能够使用修改后的代码进行国家/地区搜索:

case
  when User.where("active_user = ?", '1').count > 0 # blocked users exist
    @users = User.where("active_user = ?", '1').all
  when params[:country_id].present?
    @users = User.where("country_id = ?", params[:country_id].to_i).all
  else
    @users = User.text_search(params[:query])
end 

唯一的问题是,在国家搜索之后,为了让名字搜索工作正常,人必须在国家列表中选择空白条目。除此之外,这个问题已经解决了。不需要很长时间就可以弄清楚如何清除params[:country_id]中的值。或者我可以对参数[:query].present?执行隐式检查。谢谢你的帮助。另一双眼睛确实有帮助。

我想知道我是否必须制作两种不同的表格。我正在使用的表单是。我会照你的建议做,再试一次。这对我来说是一个新命令。非常感谢。您上面包含的代码使用的是form_tag:让我们知道它是如何工作的,如果它工作,请记住标记此答案。建议的代码现在起作用,当有人选择一个国家时,当他们单击“选择一个国家”时,它将保持所选国家处于选中状态。现在我需要弄清楚如何显示所选ID的用户记录。它在检查提交时似乎完全忽略了when子句。当我检查test.log文件时,我看到它在哪里检查第一个When子句并跳过它,它应该从我的测试数据中跳过它。然后它转到else子句,显然没有检查我的params[:commit]子句。我还将其更改为使用params[:submit],但得到了相同的结果。@LightBeCorp您对case/when的使用有点奇怪,但我还是不太明白您想要实现什么。你的when语句似乎彼此非常独立,那么第一个when是否为真,以及随后的when是否从未被计算过呢?这就是我要检查的。我希望他们独立,只有一个执行。when子句的顺序是关于我希望如何执行它们。在最后一次响应之后,我尝试先执行params[:commit]子句,但得到了相同的结果。我写这条条款的方式似乎有些问题,我现在还看不到。其他两个条款有效。看起来像大海捞针 在这一点上:
case
  when User.where("active_user = ?", '1').count > 0 # blocked users exist
    @users = User.where("active_user = ?", '1').all
  when params[:country_id].present?
    @users = User.where("country_id = ?", params[:country_id].to_i).all
  else
    @users = User.text_search(params[:query])
end