我只使用了一次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" %>
<span valign="center"><%= submit_tag "Search by Name", class: "btn btn-medium btn-custom", :name => nil %></span>
<%= collection_select(:user, :country_id, Country.order('name'), :id, :name, {:selected => 233}) %>
<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 :)
任何帮助将不胜感激。