使用collection_select在Active Record中搜索 - Rails 3.2.9

时间:2012-12-19 21:56:12

标签: ruby-on-rails ruby-on-rails-3.2

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

http://localhost:3000/users_admin?utf8=✓&query=&user%5Bcountry_id%5D=75

这是我拥有collection_select语句的表单。当我使用所选country_id在User模型上添加/更新记录时,我复制了我成功使用的语句。我希望我的逻辑做的是当我选择一个国家并单击“按国家/地区搜索”时,所选国家/地区在下拉列表中保持选中状态,并且屏幕上会显示带有所选country_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 %>

这是我控制器中的代码。

def users_admin
  case
  when User.where("active_user = ?", '1').count > 0 # blocked users exist
    @users = User.where("active_user = ?", '1').all
  when params[:commit]=='Search by Country'
    @users = User.where("country_id = ?", params[:country_id]).all
  else
    @users = User.text_search(params[:query])
  end 
  @microposts = Micropost.all
end

我不确定问题是关于collection_select语句的编码方式还是其他逻辑问题。我的第一个想法是,我需要以某种方式保存collection_select语句中的选定值,然后在我的where子句中使用它。但我不知道如何重新编写语句来做到这一点,并且默认选择值为233,这是首次显示屏幕时的美国。我也想过,也许我应该有两种不同的形式而不是一种形式。我现在还不知道应该走的方向。

我主要搜索Stack Overflow有关此问题的问题。与collection_select相关的问题大部分都与我可能会用它的方式有关。我再一次只使用了collection_statement:)

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

当您在表单中使用模型时(例如,当您使用form_for @user do时,而不是form_tag

时,应使用

collection_select

尝试这样的事情:

<%= select_tag :country_id, options_from_collection_for_select(Country.all, :id, :title, params[:country_id]), include_blank: true %>

params[:country_id]参数确保在用户提交搜索表单后,您的下拉列表中会选择通过GET请求传入的country_id。

btw,当涉及模型(正在创建/更新)时使用form_for。如果您要创建搜索表单,则不是这种情况,您应该使用form_tag

阅读本文以获取更多信息:http://guides.rubyonrails.org/form_helpers.html#making-select-boxes-with-ease

答案 1 :(得分:0)

在做了更多搜索之后,我决定在我的视图中显示参数,以便查看哈希中的内容。我没有在submit_tag中提交,所以我改为检查是否存在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]中的值。或者我可以对params [:query] .present进行隐式检查? 。谢谢你的帮助。另一双眼睛确实有帮助。