我只使用了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" %>
<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:)
任何帮助将不胜感激。
答案 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进行隐式检查? 。谢谢你的帮助。另一双眼睛确实有帮助。