Дождаться окончания действия, прежде чем показывать модал? - PullRequest
0 голосов
/ 14 мая 2019

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

#index.html.erb
<% @outstanding_cars.each_with_index do |car, index| %>
  ...
  <%= button_to "ADD FAVORITE", {controller: 'home', action: 'new_favorite', favorite_car_id: car.id}, remote: true, data: {toggle: 'modal', target: '#favorite_modal'} %>
  <div id='favorite_modal' class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
  ...
    <%= render partial: 'layouts/new' %>
  </div>
<% end %>

#home_controller.rb
  def new_favorite
    if !session[:favorites_ids].present?
      session[:favorites_ids] = []
    end
    if session[:favorites_ids].length < 3
      session[:favorites_ids] << params[:favorite_car_id]
      session[:favorite_added]= true
    else
      session[:favorite_added] = false
    end
  end

#_new.html.erb
  <div class="modal-dialog" role="document">
  <div class="modal-content">
    <div class="modal-header">
      <button title="Cerrar" class="close" data-dismiss="modal">
        <span aria-hidden="true">&times;</span>
      </button>
    </div>
    <div class="modal-body">
      <% if session[:favorite_added] %>
        <p>
          Added!
        </p>
      <% else %>
        <p>
          Enough cars for now, buddy.
        </p>
      <% end %>
      <div class="clear"></div>
    </div>
  </div>
</div>

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Прежде всего, вы добавляете элемент с идентификатором 'favour_modal' на каждую итерацию выдающегося_карты, у вас будет несколько элементов с одинаковым идентификатором, что неверно.

Вы должны визуализировать модальное представление как действие new_favorite вместо предварительной визуализации модального в представлении индекса.

Итак, удалите эту строку render 'layouts/new' и сделайте что-то вроде:

#at views/home/new_favorite.js.erb
document.body.insertAdjacentHTML('beforeend', '<%= j render partial: 'layouts/new_modal' %>');
$('#favorite_modal').modal('toggle');

Удалите модальный DIV из цикла и добавьте полный HTML-код, а не только содержимое модального.

#at views/layouts/_new_modal.html.erb
<div id='favorite_modal' class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
  <%= render partial: 'layouts/new' %>
</div>
1 голос
/ 14 мая 2019

Вам нужно будет добавить несколько js, чтобы обновить партиал новым сеансом после входа в контроллер, а также переместить код для запуска модального режима в js после обновления партиала.Кроме того, вам нужно держать модальный div вне цикла 'выдающиеся_карты', чтобы у нас был только один div для обновления вместо одного div для каждой машины (спасибо @arieljuod, заметил это только после его ответа):

#index.html.erb
<% @outstanding_cars.each_with_index do |car, index| %>
  ...
  <%= button_to "ADD FAVORITE", {controller: 'home', action: 'new_favorite', favorite_car_id: car.id}, remote: true} %>
<% end %>

<div id='favorite_modal' class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
  ...
  <%= render partial: 'layouts/new' %>
</div>

#home_controller.rb
  def new_favorite
    session[:favorite_added] = false
    session[:favourite_ids] ||= []
    if session[:favorites_ids].length < 3
      session[:favorites_ids] << params[:favorite_car_id]
      session[:favorite_added] = true
    end
  end

# app/views/home/new_favorite.js.erb
$('#favorite_modal').html("<%= j render partial: 'layouts/new' %>");
$('#favorite_modal').modal('toggle');

Код j является псевдонимом для escape_javascript , который экранирует кавычки и другие элементы из html-кода, возвращаемого рельсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...