组被删除后发送通知给会员?

时间:2017-03-07 02:47:42

标签: ruby-on-rails push-notification

在我的应用中,我想在管理员删除群组时将通知推送到群组成员,但我遇到了问题,我使用以下方法保存该群组的成员:group_members = @group.users 但是当组被删除时,此group_members变为nil,因此我无法将通知推送给他们。有人能给我一个如何拯救这些成员的理想吗?非常感谢 这是我的控制器

class Admin::GroupsController < Admin::BaseController
  before_action :load_group

  def destroy
    group_members = @group.users
    if @group.destroy
      notify_to_group_members group_members
      flash[:success] = t "flash.delete_success", record: Group.name
    else
      flash[:danger] = t "flash.delete_fail", record: Group.name
    end
    binding.pry
    redirect_to admin_company_management_groups_path
  end

  private
  def notify_to_group_members members
    members.each do |member|
      message = Aws::Sns::GeneratePayload.call I18n.t("company.push_messages.group.delete"),
        action: :delete, type: :group, device: member.device
      Aws::Sns::PublishToEndpoint.delay.call member, message
    end
  end

  def load_group
    @group = Group.find_by_id params[:id]
  end
end

2 个答案:

答案 0 :(得分:1)

您需要复制@group.users

group_members = @group.users.dup

这种方式group_members不会指向原始对象,以后会被销毁。

如果@group没有销毁,您也可以将其包装在一个事务中:

group_members = @group.users.dup
if @group.transaction do
    @group.destroy
    notify_to_group_members group_members
  end
  flash[:success] = t "flash.delete_success", record: Group.name
else
  flash[:danger] = t "flash.delete_fail", record: Group.name
end

答案 1 :(得分:0)

你有不同的方法可以做到这一点,但是&#34; Rails就像通过使用回调来实现这一点。 before_destroy回调在任何验证之后和实际销毁发生之前发生。

您可以在模型中执行此操作(假设您使用的是ActiveRecord):

class Group < ActiveRecord::Base
  # Add a before destroy callback
  # This will be called just before the group (and the dependent members are destroyed)
  before_destroy :notify_to_group_members

  # Rest of your methods

  private
  def notify_to_group_members
    members.each do |member|
      message = Aws::Sns::GeneratePayload.call I18n.t("company.push_messages.group.delete"),
        action: :delete, type: :group, device: member.device
      Aws::Sns::PublishToEndpoint.delay.call member, message
    end
  end
end

然后你的控制器将干涸&#34;因为通知逻辑在组模型中。

class Admin::GroupsController < Admin::BaseController
  before_action :load_group

  def destroy
    group_members = @group.users
    if @group.destroy
      flash[:success] = t "flash.delete_success", record: Group.name
    else
      flash[:danger] = t "flash.delete_fail", record: Group.name
    end
    binding.pry
    redirect_to admin_company_management_groups_path
  end

  private

  def load_group
    @group = Group.find_by_id params[:id]
  end
end

这样,您就可以确保通知您的成员并删除该组。