0

我关注了这个railscast并成功地将国家和城市显示为动态选择菜单,以便在添加新配置文件时选择国家和城市。我在 app/views/search 中创建了一个带有索引操作的控制器“ search_controller.rb ”和一个视图“ index.html.erb ”。现在我想在 app/views/search/index.html.erb 中创建一个搜索表单

  1. 自动完成文本字段以按个人资料的主题进行搜索(此表中近 400 个主题)
  2. 国家和城市动态选择菜单可按个人资料的国家和城市进行搜索。

应用程序/模型/profile.rb

has_many :categorizations
has_many :subjects, through: :categorizations

belongs_to :country
belongs_to :city

应用程序/模型/subject.rb

has_many :categorizations
has_many :profiles, through: :categorizations

应用程序/模型/分类.rb

belongs_to :profile
belongs_to :subject

应用程序/模型/国家.rb

has_many :cities
has_many :profiles

应用程序/模型/city.rb

belongs_to :country
has_many :profiles

app/views/profiles/_form.html.erb

<div class="field">
  <%= f.label :country_id %><br />
  <%= f.collection_select :country_id, Country.order(:name), :id, :name, include_blank: true %>
</div>

应用程序/资产/javascripts/profiles.js.coffee

$('#profile_city_id').parent().hide()
cities = $('#profile_city_id').html()
$('#profile_country_id').change ->
country = $('#profile_country_id :selected').text()
escaped_country = country.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1')
options = $(cities).filter("optgroup[label='#{escaped_country}']").html()
if options
  $('#profile_city_id').html(options)
  $('#profile_city_id').parent().show()
else
  $('#profile_city_id').empty()
  $('#profile_city_id').parent().hide()
4

1 回答 1

0

这是我sunspot-solr的搜索和twitter-typeahead-rails自动完成解决方案。在模型中添加可搜索块后,我为我的应用程序使用了以下代码。我通过 twitter typeahead 将我的主题列表加载到本地存储中,因为它不会改变,但如果需要,您可以使用 json。

应用程序/控制器/search_controller.rb

def index
  @search = Profile.search do
    fulltext params[:search]
    with(:city_id, params[:city]) if params[:city].present?
  end
  @profiles = @search.results
end

应用程序/视图/搜索/index.html.erb

<%= text_field_tag :search, params[:search], :class => 'typeahead' %>
<div class="field">
  <%= select_tag :country, options_from_collection_for_select(Country.all, :id, :name, params[:country]), include_blank: true %>
</div>
<div class="field">
  <%= select_tag :city, option_groups_from_collection_for_select(Country.order(:name), :cities, :name, :id, :name, params[:city]), include_blank: true %>
</div>
<%= submit_tag "search", :name => nil, :class => 'btn btn-default' %>

应用程序/资产/javascripts/profiles.js.coffee

$('#city').parent().hide()
cities = $('#city').html()
$('#country').change ->
  country = $('#country :selected').text()
  escaped_country = country.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1')
  options = $(cities).filter("optgroup[label='#{escaped_country}']").html()
  if options
    $('#city').html(options)
    $('#city').parent().show()
  else
    $('#city').empty()
    $('#city').parent().hide()

$('.typeahead').typeahead({                                
  local: ["3D Design", "Architecture", "Chemical engineering", ...]
  limit: 10                                                                   
});
于 2013-10-09T20:53:06.243 回答