Мы выяснили, что у нас была проблема с решением от @mattdlockyer (спасибо за решение!). При использовании свойства selector для конструктора popover, подобного этому ...
$(document.body').popover({selector: '[data-toggle=popover]'});
... предлагаемое решение для BS3 не будет работать. Вместо этого он создает второй экземпляр popover, локальный для своего $(this)
. Вот наше решение, чтобы предотвратить это:
$(document.body).on('click', function (e) {
$('[data-toggle="popover"]').each(function () {
//the 'is' for buttons that trigger popups
//the 'has' for icons within a button that triggers a popup
if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
var bsPopover = $(this).data('bs.popover'); // Here's where the magic happens
if (bsPopover) bsPopover.hide();
}
});
});
Как уже упоминалось, $(this).popover('hide');
создаст второй экземпляр из-за делегированного прослушивателя. Решение предоставило только скрытые popovers, которые уже были созданы.
Надеюсь, я смогу сэкономить вам время.
Убедитесь, что вы вызываете load_and_authorize_resource
в своем ProjectsController
в соответствии со строками:
class ProjectsController < ApplicationController
load_and_authorize_resource
#...
end
Если это все еще не работает, попробуйте Позвонив в разрешите!
внутри действия индекса, чтобы увидеть, имеет ли это значение, например:
class ProjectsController < ApplicationController
#...
def index
@projects = Project.all
authorize! :read, @projects
end
#...
end