我坚持使用模态,我需要我的方法(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">×</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>
答案 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');
代码j
是escape_javascript的别名,它从引用partail返回的html中转义引号和其他内容。