Преобразуйте options_for_select в simple_form, который использует две коллекции

Это мой первый вопрос, поэтому любые советы по облегчению для моих коллег-программистов, я был бы признателен.

Фон В форме для размещения заказа на фотообъявление вы можете выбрать марку и модель, но в списке есть полный список каждой модели (плохой пользовательский опыт). Код для формы, которая перечисляет каждую модель ниже.

 <div id="photo-ad-make-model-fields" class='make-model-year-selector'>
      <%= f.input :listing_known_make, label: 'Make',
                  collection: vehicle_selection.make_choices,
                  input_html: {
                      id: 'photo-ad-order-form-listing-known-make',
                      class: 'vehicle-make form-control select2 jcf-ignore',
                      data: {
                          target: 'photo-ad-order-form-listing-known-model',
                          placeholder: 'Select a make'
                      }
                  } %>
      <%= f.input :listing_known_model, label: 'Model',
                  collection: vehicle_selection.all_model_choices,
                  input_html: {
                      id: 'photo-ad-order-form-listing-known-model',
                      class: 'vehicle-model form-control select2 jcf-ignore',
                      data: {
                          placeholder: 'Select a model'
                      }
                  } %>

Существует частичная часть, используемая пользователями для поиска по маркам или моделям, и она работает именно так, как я хочу, чтобы она работала. пользователь выбирает марку, нажимает на вход для модели и перечисляет только конкретные модели. Код ниже

<fieldset class="make-model-selector"> <div class="form-group clearfix"> <%= select_tag :make, options_for_select(vehicle_selection.make_choices, vehicle_selection.make), include_blank: true, class: 'vehicle-make form-control select2 jcf-ignore', data: { target: 'model', placeholder: 'Any Make' } %> </div> <div class="form-group clearfix"> <%= select_tag :model, options_for_select(vehicle_selection.model_choices, vehicle_selection.model), include_blank: true, class: 'vehicle-model form-control select2 jcf-ignore', data: { placeholder: 'Any Model' } %> </div> </fieldset> Это обусловлено сценарием Java, который зависит от модели рельсов, и находится в каталоге представлений в каждой папке представлений моделей. (первый раз, когда речь заходит о js вне application.js, это устаревший код, написанный другой компанией). По результатам исследований я определил, что это функция rails, и при использовании синтаксиса rails в java script он не будет работать в файле application.js, но, в частности, по пути к папке моделей в представлении, он будет запускаться. (пожалуйста исправьте меня или дайте мне знать больше об этой функции рельсов, о которой я не знал)

Расположение файлов index.js для марки и модели в иерархии приложения

Код внутри view/make/index.js

$('#<%= @target %>') .html('<%=j options_for_select(@makes) %>') .data('placeholder', 'Select a Make');

Код внутри вида / модель / index.js

$('#<%= @target %>') .html('<%=j options_for_select(@models) %>') .data('placeholder', 'Select a Model');

Итак, к моей проблеме, форма фотообъявления является частью конструктора simple_form_for. Так что я знаю, что мне нужно преобразовать частичный код в простую форму и включить локальную переменную формы, чтобы отделить объект формы с сохранением в базе данных.

Моя simple_form преобразованная версия частичного, в его собственном частичном названном _make_select.erb

  <fieldset class="make-model-selector">
      <div class="form-group clearfix">
          <%= f.input :listing_known_make, label: 'Make', 
                        collection: vehicle_selection.make_choices,
                        input_html: {
                        class: 'vehicle-make form-control select2 jcf-ignore', 
                        id: 'photo-ad-order-form-listing-known-make',
                        data: {
                           target: 'photo-ad-order-form-listing-known-model',
                           placeholder: 'Any Make'
                       }
                    } %>  
      </div>

      <div class ="form-group clearfix">
          <%= f.input :listing_known_model, label: 'Model', 
                      collection: vehicle_selection.model_choices, 
                      input_html: {
                      class: 'vehicle-model form-control select2 jcf-ignore', 
                      id: 'photo-ad-order-form-listing-known-model',
                       data: {
                            placeholder: 'Any Model'
                             }
                          }
                       %>   
      </div>
</fieldset>

Мой вызов этого частичного в виде частичного _form.html.erb

<%= render partial: 'photo_ad_orders/make_select.html.erb', locals: {f: f} %>

Так что это работает, как я и ожидал, вы выбираете марку, и модель фильтруется, как и ожидалось, я нажимаю, чтобы сохранить базу данных, установив правильную цель, символы и идентификаторы. Он успешно сохраняет ваш выбор в базу данных.

[Успешный выбор формы][2]

Так что теперь проблема

Я думал, что успешно выполнил функцию, которую они хотели, чтобы я сделал, но после тестирования этой функции в качестве гарантии я определил, что, когда пользователь нажимает кнопку редактирования, направляет страницу редактирования. Все содержимое остается в том виде, в котором оно должно быть активировано активной записью, включая "Сделать выбранным". НО поле модели пусто, когда вы нажимаете на поле, там нет доступных моделей, основанных на марке. Пользователь должен щелкнуть поле make, выбрать другую марку(Audi) для запуска запроса, вернуться к правильной марке (Aston Martin), затем появятся модели (DB7 и т. Д.), И пользователь сможет выбрать правильную модель.

После нажатия редактировать это проблема

Так

  1. выбранная модель должна быть заполнена при нажатии изменить
  2. пользователь должен по крайней мере уже запрашивать доступные модели, потому что при повторном рендеринге марка сохраняется

Я верю в это, потому что когда я конвертировал в простую форму, я не знаю, как включить нулевой регистр, как в options_for_select (collection, collection)

Так что мне нужен правильный способ конвертировать это в simple_form

   <%= select_tag :model, options_for_select(vehicle_selection.model_choices, vehicle_selection.model),
               include_blank: true,
               class: 'vehicle-model form-control select2 jcf-ignore',
               data: {
                   placeholder: 'Any Model'
               } %>

Может кто-нибудь сказать мне правильный способ конвертировать этот options_for_select, используя две коллекции в simple_form

У меня было больше изображений, но stackru позволял мне использовать только 2 из-за репутации.

2 ответа

Решение

Я определил, что мне нужно изменить метод и дать модели ввод всех доступных моделей, и позволить javascript обрабатывать фильтрацию.

Это работает для меня сейчас.

 <div class ="form-group clearfix">
          <%= f.input :listing_known_model, label: 'Model', 
                      collection: vehicle_selection.all_model_choices, 
                      input_html: {
                      class: 'vehicle-model form-control select2 jcf-ignore', 
                      id: 'photo-ad-order-form-listing-known-model',
                       data: {
                            placeholder: 'Any Model'
                             }
                          }
                       %>   
      </div>

vehicle_selection.rb

def model_choices @model_choices || = make.present?? model_source.call (make): [] end

def all_model_choices @all_model_choices || = -> {MakeModel.models} end

Я думаю, что вы должны пройти процедуру, чтобы сделать выбор, ниже может помочь:

  f.input :listing_known_make, 
          collection: vehicle_selection.make_choices, 
          input_html: { multiple: true }, 
          selected: -> (make) { vehicle_selection.make.any? {|x| x == make} }
Другие вопросы по тегам