在我的应用中,我想在管理员删除群组时将通知推送到群组成员,但我遇到了问题,我使用以下方法保存该群组的成员: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
答案 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
这样,您就可以确保通知您的成员并删除该组。