Rails – 动态选择 – 集合选择

我一直试图让一些动态选择function正常工作,但尽管有许多不同的教程,我还没有让它工作。 为了便于阅读,我将代码示例归结为基础知识。 任何建议将不胜感激。

在故障页面上,我需要指定公司并联系故障,但我只希望能够看到与所选公司关联的联系人

Fault - belongs_to :company, :user, :contact User - has_many :faults Contacts - has_and_belongs_to_many :companies Company - has_and_belongs_to_many :contacts, has_many :faults 

/faults/_form.html.erb

   "Please select a company") %>
"Select a Contact" %> "companies", :action => "index"}, :confirm => "To add a contact for a company you need to do this from the companies page." %>

疑难杂症。 使用UJS,您可以通过5个步骤动态填充您的选择。

  1. 在视图中为您的选择添加类名
  2. 添加JavaScript(或Cof​​feeScript)以观察select元素的更改
  3. 创建一个控制器方法,根据您的选择获取所需的信息
  4. 添加路径以匹配新的控制器方法
  5. 创建UJS视图以更新您的联系人选择

所以,

  1. 添加类名:

     <%= f.label :company, "Company:" %> <%= collection_select(:fault,:company_id,@companies,:id,:name, {:prompt => "Please select a company"}, {:class => "company_selection"}) %> <%= f.label :contact, "Contact:" %> <%= f.collection_select :contact_id, @contacts, :id, :name, {:prompt => "Select a Contact"}, {:class=>"contact_selection"} %> 
  2. 扔一些CoffeeScript( app/assets/javascripts/faults.js.coffee

     $(document).ready -> $(".company_selection").on "change", -> $.ajax url: "/faults/get_contacts" type: "GET" dataType: "script" data: company_id: $('.company_selection option:selected').val() 
  3. 更新故障控制器

     def get_contacts @company = Company.find params[:company_id] @contacts = @company.contacts end 
  4. 为新方法添加路由

     resources :faults do collection do get 'get_contacts', to: "faults#get_contacts" end end 
  5. 添加UJS文件( app/views/faults/get_contacts.js.erb

     $('.contact_selection').empty(); $('.contact_selection').append( $('')); <% @contacts.each do |contact| %> $('.contact_selection').append($('')); <% end %>