繁体   English   中英

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

[英]Using collection_select for Searching In Active Record - Rails 3.2.9

我只使用一次collection_select来填充关联的模型用户上的国家/地区ID。 现在,我想在另一个视图上使用相同的collection_select语句搜索User,并列出选定国家/地区的Users。 我的尝试失败了。 选择一个国家/地区后,我可以查看该链接,并查看该国家/地区的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 :)

任何帮助将不胜感激。

当您在表单中使用模型时,应该使用collection_select(即,当您使用form_for @user do而不是form_tag

尝试这样的事情:

<%= 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。

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

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

经过更多搜索之后,我决定在视图上显示参数,只是为了查看哈希中的内容。 我的commit_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进行隐式检查? 谢谢你的帮助。 确实有一双眼睛确实有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM