gpt4 book ai didi

ruby-on-rails - 如何从 ActiveAdmin 调用 Controller 操作?

转载 作者:行者123 更新时间:2023-12-01 04:02:32 25 4
gpt4 key购买 nike

我的reports_controller.rb 中有这个方法,它允许用户发送状态。

def send_status        
date = Date.today
reports = current_user.reports.for_date(date)
ReportMailer.status_email(current_user, reports, date).deliver
head :ok
rescue => e
head :bad_request
end

如何从 ActiveAdmin 调用此操作,以检查用户是否发送了此报告?我希望它像列上的 status_tag 或其他东西。
我应该执行成员(member)操作吗?

谢谢!

最佳答案

稍后我将解决检查报告是否已发送的问题,但首先我将讨论如何从 ActiveAdmin 调用 Controller 操作的问题。

您可以调用ReportsController#send_status通过创建 ActionController::Base::ReportsController然后调用所需的方法,例如

ActionController::Base::ReportsController.new.send_status

这不是一个好主意。您可能应该重构它以解决几个潜在问题。
app/controllers/reports_controller.rb :
class ReportsController < ApplicationController

... # rest of controller methods

def send_status
if current_user # or whatever your conditional is
ReportMailer.status_email(current_user).deliver
response = :ok
else
response = :bad_request
end

head response
end
end
app/models/user.rb :
class User < ActiveRecord::Base
... # rest of user model

def reports_for_date(date)
reports.for_date(date)
end
end
app/mailers/reports_mailer.rb
class ReportsMailer < ActionMailer::Base
... # rest of mailer

def status_email(user)
@user = user
@date = Date.today
@reports = @user.reports_for_date(@date)

... # rest of method
end
end

这显然可以进一步重构,但提供了一个不错的起点。

需要考虑的重要一点是,此 Controller 操作不会异步发送电子邮件,因此为了并发和用户体验,您应该强烈考虑使用排队系统。使用我提供的示例,DelayedJob 将是一个简单的实现(查看 DelayedJob RailsCast)。

至于检查报告是否已发送,您可以实现一个 ActionMailer 观察者并注册该观察者:

这要求 User模型有一个 bool 列 status_sent并且用户拥有唯一的电子邮件地址。
lib/status_sent_mail_observer.rb :
class StatusSentMailObserver
self.delivered_email(message)
user = User.find_by_email(message.to)
user.update_attribute(:status_sent, true)
end
end
config/intializer/setup_mail.rb :
... # rest of initializer
Mail.register_observer(StatusSentMailObserver)

如果您使用的是 DelayedJob(或几乎任何其他排队系统),您可以实现一个回调方法,以便在作业完成时调用(即发送状态电子邮件),以更新用户的列。

如果您想跟踪每天的状态消息,您应该考虑创建一个 Status属于 User 的型号.每次用户发送电子邮件时都可以创建状态模型,让您可以通过检查是否存在状态记录来检查电子邮件是否已发送。我会认真考虑采用这种策略,而不是简单的 status_sent柱子。

tl;博士 ActionController::Base::ReportsController.new.send_status & 实现一个观察者来更新跟踪状态的用户列。但你真的不想那样做。像我上面提到的那样研究重构。

关于ruby-on-rails - 如何从 ActiveAdmin 调用 Controller 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12491443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com