2017-04-17 68 views
-1

我想執行自定義搜索,並希望將國家作爲執行搜索的選項之一。我對搜索控制器的動作看起來是這樣的:Rails國家選擇下拉菜單搜索:如何在頂部顯示優先國家

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

而且我的模型包含了所有這些領域(例如:範圍:全國各地, - >(國家){其中國家:國家}

所以我嘗試了幾個選項,並且到目前爲止沒有發現一個,我會滿足於完全

選項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個例外。

缺點:它需要一種叫「用戶」作爲第一個參數,這是我設置爲無,並且它會導致怪異的行爲在GET - 它通過「%5Bcountry%5D =」,而不是簡單的「國=',我不喜歡它。我沒有找到擺脫它或解決它的方法。

有關如何更好/更清潔的建議?

+0

誰說過你需要傳遞'user'到'country_select',這一切都取決於你如何是建立你的表格。 – fanta

+0

這是文檔頁面https://github.com/stefanpenner/country_select 'country_select(「user」,「country」)' – user3735111

+0

但這不是要求,這就是他們想要使用的,你可以以許多不同的方式使用它,看看Alexander Luna發佈的內容,他給了你另一個例子。這就是爲什麼我說這取決於你如何構建你的表單。 – fanta

回答

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

+0

不太清楚在我的代碼中如何以及在何處實現此功能。 – user3735111

0

您可以使用country_select寶石,並用它在你的形式是這樣的:

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

如果你不想使用的寶石,你可以創建一個Ruby對象存儲所有國家的縮寫名單。這裏是一個Ruby散列,你可以在你的視圖使用:

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

只要將它複製到你的項目,並在您的視圖中使用它。 我建議你閱讀形式的Rails文檔,否則你可能會在未來的問題:?

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

+0

我對Ruby比較新,你能解釋一下User.new是什麼嗎? 到目前爲止,我唯一遇到的form_for是使用@articles: <%= form_for @ article do | f | %> – user3735111

+0

你也可以使用@article。它只是假設你想創建一個用戶。但是當你創建一篇文章時,你只需將User.new替換爲你的對象(@article)。我更新我的答案。 –

+0

我在整個form_for中有點失落:我需要什麼用戶?它會對您造成什麼影響? (@article)存儲我不希望影響的數據 - 我使用它進行搜索/過濾。 – user3735111