等待动作完成后再显示模式吗?

时间:2019-05-13 22:01:27

标签: jquery ruby-on-rails ruby ruby-on-rails-5

我坚持使用模态,我需要我的方法(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 个答案:

答案 0 :(得分:2)

首先,您要在每个杰出的汽车迭代中添加一个ID为“ favorite_modal”的元素,您将有多个具有相同ID的元素,这是不正确的。

您应该将模式呈现为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 :(得分:1)

进入控制器后,您将需要添加一些js以使用新会话更新部分代码,并且还需要在部分代码更新后移动代码以触发模态到js。 另外,您需要将模式div保持在“ outstanding_cars”循环之外,以便我们仅更新一个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');

代码jescape_javascript的别名,它从引用partail返回的html中转义引号和其他内容。

相关问题