Я делаю приложение на Rails 4. Я использую Simple Form.

У меня есть модель профиля и модель квалификации.

Ассоциации являются:

Profile.rb

belongs_to :profile

Qualifications.rb

has_many :qualifications  

У меня есть форма в представлениях моего профиля, которая включает в себя часть формы из представления моей квалификации.

Профили # форма

<%= simple_form_for(@profile) do |f| %>
            <%= f.error_notification %>

              <div class="form-inputs">

          <div class="row">

            <div class="intpol2">
              Your professional qualifications
            </div>

              <%= render 'qualifications/form', f: f %>     

          </div>

Квалификация # форма

<%= simple_fields_for :qualification do |f| %>

  <div class="form-inputs">


    <div class="row">
        <div class="col-md-6">
            <%= f.input :title, :label => "Your award" %> 
        </div>

        <div class="col-md-6">


        </div>


    </div>

    <div class="row">
        <div class="col-md-6">
            <%= f.input :level,   collection: [ "Bachelor's degree", "Master's degree", "Ph.D", "Post Doctoral award"] %>
        </div>


        <div class="col-md-6">
        <%= f.input :year_earned, :label => "When did you graduate?", collection: (Date.today.year - 50)..(Date.today.year) %>
        </div>

  </div>

Пользователи могут иметь более одной степени. Я хочу добавить поле, которое представляет собой кнопку с надписью «добавить еще одну квалификацию», а затем станет доступен новый набор полей формы квалификации.

Я нашел этот пост, который пытается сделать что-то немного другое. Мне не нужны 10 пустых наборов поля формы (из-за этого форма будет выглядеть слишком длинной).

Создание нескольких записей для модели в одном представлении в Rails

Есть ли другой способ добиться этого?

1
Mel 30 Дек 2015 в 11:36

2 ответа

Лучший ответ

Вы будете искать драгоценный камень под названием cocoon; вы также можете посмотреть этот Railscast (Nested forms) К сожалению, устаревшая, но все же очень хорошо объясняющая структуру.


Выкройка очень простая, но требует дополнительных деталей:

  1. Иметь кнопку ajax, которая вызывает контроллер.
  2. Контроллер должен вернуть форму и построить fields_for
  3. Вы будете использовать JS для добавления нового fields_for в исходную форму

Самая большая проблема - это id вашего нового fields_for - новые реализации этого шаблона используют child_index: Time.now.to_i

Я писал об этом здесь .

Вот новая версия:


Ajax

Во-первых, вам понадобится кнопка «Добавить квалификацию» , которая соединяется с вашим контроллером через ajax:

#app/views/profiles/_form.html.erb
<%= simple_form_for(@profile) do |f| %>
    <%= f.error_notification %>
    <div class="form-inputs">
       <div class="row">
         <div class="intpol2">Your professional qualifications</div>
         <%= render 'qualifications/form', f: f %>     
       </div>
    </div>
       <%= button_to "+", new_profile_path, method: :get %>
<% end %>

Контроллер

Это будет проходить через метод контроллера new , которым мы должны суметь вернуть конкретный ответ на запрос ajax:

#app/controllers/profiles_controller.rb
class ProfilesController < ApplicationController
   respond_to :js, :html, only: :new
   def new
      @profile = Profile.new
      @profile.qualifications.build
      respond_with @profile #-> will invoke app/views/profiles/new.js.erb
   end
end

Отклик

Как только ваш new.js.erb будет запущен, нам нужно создать новую HTML-форму, извлечь fields_for и добавить его в ваше представление:

#app/views/profiles/new.js.erb
var fields_for = $("<%=j render "profiles/form" %>").html(); //-> might need tweaking
$(fields_for).appendTo("#new_profile.form-inputs");

< Сильный > CHILD_INDEX

Вам также следует изменить свой qualifications/form, чтобы включить child_index:

#app/views/qualifications/form.html.erb
<%= simple_fields_for :qualifications, child_index: Time.now.to_i do ...

Дочерний индекс предназначен для обозначения index элементов fields_for. В нашем случае (поскольку мы делаем все новые записи) это не имеет значения. Использование Time.now.to_i гарантирует каждый раз абсолютно уникальный id.


Наконец, вам нужно убедиться, что вы звоните:

 <%= simple_fields_for :qualifications ... %> 

... множественное число

0
Community 23 Май 2017 в 11:59

Похоже, вам нужно использовать вложенную форму. Вы должны попробовать свой учебник по ссылкам, потому что я тоже буду использовать его. Для другого руководства вы можете использовать его как ссылку nested_forms-rails-4.2.

Надеюсь, это вам поможет.

0
akbarbin 30 Дек 2015 в 09:18