1

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

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

这是我有 collection_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 %>

这是我的控制器中的代码。

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

任何帮助将不胜感激。

4

2 回答 2

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 进行隐式检查?. 谢谢你的帮助。另一双眼睛确实有帮助。

于 2012-12-20T22:27:14.353 回答
0

当您在表单中使用模型时,应该使用 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

于 2012-12-19T23:36:19.473 回答