2013-11-11 6 views
5

Я пытаюсь работать с динамическими функциями выбора, но, несмотря на множество разных уроков, я еще не получил работу. Для удобства чтения я привел примеры кода к основам. Любые рекомендации будут очень признательны.Rails - Dynamic Select - Collection Select

На странице неисправностей, мне нужно назначить компанию и связаться по вине, но я только хочу, чтобы иметь возможность видеть контакты, связанные с выбранной компанией

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> 
+0

И каковы ассоциации в модели компании? Кроме того, рельсы 3 или рельсы 4? – trh

+0

Обновлено, и рельсы 3 –

ответ

17

Gotcha. Используя UJS, вы можете динамически заполнить свой выбор в 5 шагов.

  1. имен Добавить класс в выбираешь в представлении
  2. Добавить JavaScript (или CoffeeScript), чтобы наблюдать за изменения на выборе элемента
  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. Throw в некоторых 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. Update контроллер разломы

    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 %> 
    
+0

Фантастично, спасибо! –

+0

Только что заметил это в $ ('. Contact_selection'). Append ($ ('')); Он говорит <# = contact.id, который должен быть <% = contact.id –

+0

Как вы проверяете свой взгляд с Rspec и Capybara? Как вы говорите, что дождаться окончания AJAX-звонка, можете ли вы описать, пожалуйста? –