如何通知用户新活动?

时间:2016-01-05 10:17:14

标签: ruby-on-rails angularjs

我使用Public Activity gem为我的rails / angular应用程序构建了一个活动流,并且我已经建立了一个跟随系统,用户可以相互关注。因此,当当前用户关注的用户执行操作(将电影添加到他的监视列表)时,它将创建活动记录,并且该活动将在当前用户中显示其活动流。我想通知当前用户有一项新活动。

要显示我创建了一个图标的活动,

%i.fa.fa-bell{"ui-sref" => "home.activities"}

我希望在有新活动的时候给这个图标另一个类,比如newActivities

所以我必须区分旧消息和新消息。为此我想在活动表中添加一个名为viewed的列。创建新活动时,viewed列为空。当点击显示活动的图标时,它会向viewed列添加一个值。

在角度方面,我将浏览一下活动范围(包含所有当前用户活动),查看是否存在空viewed值的活动,如果是,请添加.newActivities类到图标。

或者是否有更简单,或更好的方法来实现这一结果?

1 个答案:

答案 0 :(得分:0)

也许有人来这个问题,或者有人可以改进我的方法。但是,让我告诉你我做了什么。

首先,我在我的活动模型中创建了一个viewed字符串,

class AddViewedToActivities < ActiveRecord::Migration
  def change
    add_column :activities, :viewed, :string
  end
end

然后我将默认设置为'取消选中'

class AddDefaultToViewedInActivities < ActiveRecord::Migration
  def change
    change_column_default(:activities, :viewed, 'uncheck')
  end
end

运行db:migrate等。

然后在Angular方面,我创建了一个活动控制器,

activitiesService.loadActivities().then(function(response) {
  $scope.activities = response.data;

  var activities = $scope.activitie
  var init = function(){
    var hasValue = activities.some(function(obj) { return obj.viewed == "uncheck" });

    if (hasValue == true){
      checked = true ;
      $scope.newActivities = 'newActivities'
    }
  }

  $scope.viewActivities = function (){

    angular.forEach(activities, function (activitie) {
      if (activitie.viewed == 'uncheck'){
        viewActivities.update({
          viewed: `check`,
          id:      activitie.id
        }).then(init);
      }
    });
    $scope.newActivities = '';

  }
  init();
})

init函数检查是否存在等于“取消选中”的对象。如果这是真的,它会将类“newActitivites”添加到$ scope.newActivities` ng-class(显示是否有新消息的图标)

$ scope.viewactivities is a function that fires when a user checks his new activities. It checks each activitie and finds the new ones, with the value of取消选中。然后它会通过检查更新该记录,以便下次用户返回时,他的所有活动都已经过检查,图标也不会改变。

为了完成,这里是活动服务,

app.factory('viewActivities', ['$http', function($http) {
  return {
    update: function(activitie) {
      return $http.put('/activities/' +activitie.id + '.json', activitie);
    }
  };
}])

rails中的活动控制器,

def update
  @activity = PublicActivity::Activity.find(params[:id])
  @activity.update_attributes(activity_params)
  redirect_to :root
end

你必须在你的路线中设置它,

resources :activities, only:    [:create, :destroy, :index, :show, :update, :put]