Rails国家/地区选择搜索下拉列表:如何在顶部显示优先级国家/地区

时间:2017-04-17 21:45:25

标签: ruby-on-rails

我想执行自定义搜索,并希望将国家/地区作为执行搜索的选项之一。我对搜索的控制器操作如下所示:

@articles = Article.filter(params.slice(:category, :country, :src_url, :date, :lang, :keywords, :title))
.where(is_active: true)
.paginate(:page => params[:page])

我的模型包含所有这些范围(例如:范围:国家, - >(国家){其中country:country}

所以我尝试了一些选项,到目前为止还没有找到一个我完全满意的选项。

选项1:

<%= select_tag :country, options_from_collection_for_select(ISO3166::Country.countries.sort_by(&:name), 'name', 'name', params[:country]), :include_blank => true %>

优点:几乎我想要的东西 - 干净又简短。

缺点:无法弄清楚它是如何工作的。我发现它在某处并使用反复试验进行了一些修改。但我没有设法找到任何可以指出原因和方法的文档,而且经过反复试验,我只能走得那么远。由此出现问题 - 我无法对其进行修改以显示列表顶部的特定国家/地区,并在下方进行分类。

选项2:

<%= country_select(nil, :country, { priority_countries: %w(RU BR IN CN ZA), include_blank: true, selected: params[:country] }, {}) %>

优点:它完全符合我想要的1个例外。

缺点:它需要一些名为&#34; user&#34;作为第一个参数,我将其设置为nil,并且它导致了GET中的奇怪行为 - 它通过了&#39;%5Bcountry%5D =&#39;而不是简单的&#39; country =&#39;而且我不喜欢它。我没有办法摆脱它或解决它。

有关如何更好/更清洁的建议?

3 个答案:

答案 0 :(得分:1)

我使用rails 5.1.6,这是对我有用的解决方案。

在Gemfile中放置以下内容:

rosrun cv_camera cv_camera_node
[rospack] Error: package 'cv_camera' not found

在命令行上,使用以下命令安装为gem:

huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ source devel/setup.bash
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ source /opt/ros/kinetic/setup.bash
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ rosparam set cv_camera/device_id 1
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ rosrun cv_camera cv_camera_node
[rospack] Error: package 'cv_camera' not found
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ echo $ROS_PACKAGE_PATH
/opt/ros/kinetic/share
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ source devel/setup.bash
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ echo $ROS_PACKAGE_PATH
/home/huzeyfe/catkin_ws/src:/opt/ros/kinetic/share
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ rosrun cv_camera cv_camera_node
[rospack] Error: package 'cv_camera' not found
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ rosparam set cv_camera/device_id 1
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ rosrun cv_camera cv_camera_node
[rospack] Error: package 'cv_camera' not found
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ rospack profile
Full tree crawl took 0.018304 seconds.
Directories marked with (*) contain no manifest.  You may
want to delete these directories.
To get just of list of directories without manifests,
re-run the profile with --zombie-only
-------------------------------------------------------------
0.016891   /opt/ros/kinetic/share
0.000488 * /opt/ros/kinetic/share/OpenCV-3.3.1-dev
0.000077 * /opt/ros/kinetic/share/OpenCV-3.3.1-dev/haarcascades
0.000056 * /opt/ros/kinetic/share/OpenCV-3.3.1-dev/lbpcascades
0.000042 * /home/huzeyfe/catkin_ws/src
0.000038 * /opt/ros/kinetic/share/doc
0.000007 * /opt/ros/kinetic/share/doc/liborocos-kdl
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ rosrun cv_camera cv_camera_node
[rospack] Error: package 'cv_camera' not found
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ echo $ROS_PACKAGE_PATH
/home/huzeyfe/catkin_ws/src:/opt/ros/kinetic/share
huzeyfe@huzeyfe-Aspire-5755G:~/catkin_ws$ 

在表单视图中输入:

# country list
gem 'country_select'

在我的模型中,我添加了:

gem install country_select

答案 1 :(得分:0)

在选项1中,您将集合ISO3166::Country.countries.sort_by(&:name)传递给options_from_collection_for_select。如您所见,您已按名称对集合应用了排序。这将是使用sort_by按需排序您的选项的问题。

PRIORITY_COUNTRIES = %w[RU BR IN CN ZA]

countries = ISO3166::Country.countries.sort_by do |country|
  priority_index = PRIORITY_COUNTRIES.index(country.alpha2)
  priority_index.present? ? priority_index.to_s : country.name
end

请注意,我将索引转换为字符串,以便能够将其与国家/地区名称进行比较。

https://ruby-doc.org/core-2.4.1/Enumerable.html#method-i-sort_by

答案 2 :(得分:0)

您可以使用country_select gem并在表单中使用它:

<%= form_for @article do |f| %>
  <%= f.country_select :country_code %>
<% end %>

如果您不想使用gem,则可以创建一个Ruby对象,该对象存储所有具有缩写的国家/地区的列表。以下是您可以在视图中使用的ruby哈希:

https://github.com/karmi/localized_country_select/blob/master/locale/en.rb

只需将其复制到您的项目中并在您的视图中使用它即可。 我建议您阅读有关表单的Rails文档,否则您将来可能会遇到问题:

http://guides.rubyonrails.org/form_helpers.html