В моем приложении у меня есть уведомления пользователей, где пользователь получает уведомление для определенных действий. Эти уведомления отображаются в раскрывающемся списке на панели навигации (например, Facebook или S.O.). Все уведомления имеют атрибут boolean, называемый: read и по умолчанию установлен в false. Я использую bootstrap с выпадающими списками (в случае, если это помогает).
Я хочу создать метод, когда пользователь щелкает, чтобы открыть раскрывающийся список, все их непрочитанные уведомления становятся считанными.Rails - изменение логического значения по ссылке нажмите
Вот что я до сих пор использовал для метода.
def read_notifications
PublicActivity::Activity.where(recipient_id: current_user).where(read: false).update_all(:read => true)
end
Это обновление всех уведомлений текущего пользователя: read => true при вызове метода. В представлении вот что я имел до сих пор для выпадающей ссылки.
<%= link_to read_notifications_path, :class => "dropdown-toggle notifications_icon", :'data-toggle' => "dropdown", :controller => "application", :action => "read_notifications", :method => :post do %><% end %>
и routes.rb У меня было это.
match "/read" => "application#read_notifications", :as => "read_notifications", via: 'post'
Теперь я знаю, что я не прав, но даже когда я нажимаю на ссылку он делает переключение всех уведомлений пользователя для чтения, он просто действует также в качестве ссылки (Дух) и переходит к другому стр.
Как вы знаете, ссылка на выпадающее меню бутстрапа - «#».
Кто-нибудь знает, как я могу правильно настроить это, когда пользователь нажимает ссылку уведомления в навигационной панели, ВСЕ, что он делает, открывает выпадающий список и изменяет логическое значение на true для всех уведомлений.
Я знаю, что это возможно, я просто еще не смог понять это.
Спасибо, что посмотрели на него.
EDIT
JS файл
$(".notifications_icon").on("click", function(){
$.post("/read", function(data){
$('.notification_badge').text("");
});
});
Посмотреть
<%= link_to "#", :class => "dropdown-toggle notifications_icon", :'data-toggle' => "dropdown" do %>
<span class="notification_badge"><%= find_unread_notifications_count(current_user) %></span>
<% end %>
Это Проводка к/чтения, чтобы прочитать все из уведомлений, но не обновляет счетчик
Благодарим за ответ @Damien. –
@ Justin Я бы советовал против другого ответа. Во-первых, это будет делать запрос каждый раз, когда вы нажимаете, и он повторно отображает частичный. Если пользователь отключил JS, он пойдет по пути '/ read', когда они нажмут. Это навязчиво и опирается на негибкий способ управления обратными вызовами JS (с файлами erb.js). Об этом даже говорится в руководствах: http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#unobtrusive-javascript. У вас гораздо больше контроля, если вы извлекаете обработчик вместо простого исправления «remote: true». –
Хорошо. Спасибо за совет! –