单击通知按钮时,它将向控制器发送一个get请求,该请求应该将Activity.viewed从false更新为true。这样,我的js知道不会将其填充回通知计数中。所以:
我有一个ajax GET请求
// click EVENT TRIGGERS
$('#bell-notices').click(function(){
var $bell = $(this);
$bell.find('.notifications-count').hide('0');
$bell.parent().find('.dropdown-toggle').dropdown();
$.get('/activities/mark_activity_viewed', function( data ) {
});
});
被发送到Rails控制器
def mark_as_viewed
@mark = Activity.find_by(params[:id])
@mark.viewed = true
@mark.save!
end
一切似乎都正确到位,但是我无法更新数据库。
Activity.last的控制台
<Activity id: 190, user_id: 68, action: "created", targetable_id: 157, targetable_type: "Status", created_at: "2015-03-04 21:17:57", updated_at: "2015-03-04 21:17:57", commentable_id: nil, reference_id: nil, viewed: false>
在这种情况下,user_id是创建活动的用户,而不是接收活动的用户。
不要使用$ .get()进行更新数据的调用。而是通过PUT发送请求。由于您要更新用户的所有活动,因此不需要执行Activity.find查找。我假设您的用户模型具有定义的“ has_many:activities”关联。您的JS看起来像这样(我正在使用coffeescript):
$('#bell-notices').click ->
$bell = $(this)
$bell.find('.notifications-count').hide '0'
$bell.parent().find('.dropdown-toggle').dropdown()
$.ajax
url: '/activities/mark_activity_viewed'
type: 'put'
(作为JS):
$('#bell-notices').click(function() {
var $bell;
$bell = $(this);
$bell.find('.notifications-count').hide('0');
$bell.parent().find('.dropdown-toggle').dropdown();
$.ajax({
url: '/activities/mark_activity_viewed',
type: 'put'
});
});
在您的activity_controller中,您将拥有:
def mark_activity_viewed
current_user.activities.update_all(viewed: true)
[any respond_to stuff you care to do...]
end
您需要在routes.rb中具有与“ put”匹配的路由
put 'activities/mark_activity_viewed' => 'activities#mark_activity_viewed'
请注意,上面的“ update_all”将跳过对Activity的验证,但是由于您在此处所做的只是更改布尔值,因此这不是问题。如果要对每个活动执行验证,请遍历它们并进行典型的更新并保存!
您将哪个控制器放进去完全取决于您。我将其放在users_controller中,因为它是一个以用户为中心的操作,但是将其保留在活动控制器中没有任何问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句