Rails - 动态选择 - 集合选择

时间:2013-11-11 15:02:09

标签: ruby-on-rails

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

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

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

<%= f.label :company, "Company:" %>

<%= collection_select(:fault,:company_id,@companies,:id,:full_name, :prompt => "Please select a company") %></br>

<%= f.label :contact, "Contact:" %>

<%= f.collection_select :contact_id, @contacts, :id, :name, :prompt => "Select a Contact" %>

<%= link_to "Add New Contact", {:controller => "companies", :action => "index"}, :confirm => "To add a contact for a company you need to do this from the companies page." %></br>

2 个答案:

答案 0 :(得分:20)

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

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

    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( $('<option>Select the Contact</option>'));
      <% @contacts.each do |contact| %>
        $('.contact_selection').append($('<option value="<%= contact.id %>"><%= contact.name %></option>'));
      <% end %>
      

答案 1 :(得分:0)

Vanilla JS Option

这只能通过香草javascript实现。确保companies/[id]/contacts.json处有一条路由返回正确的数据。

const select = document.querySelector('#company_id');
select.addEventListener('change',function(e) {
  axios.get(`/companies/${e.target.value}/contacts.json`)
    .then((res) => {
      let contactSelect = document.querySelector('#contact_id')
      contactSelect.innerHTML = ''
      res.data.map((model, i) => {
        contactSelect.options[i] = new Option(model.name, model.id);
      })
    })
});
相关问题