我有一个应用程序,用户提交的周数可以被批准或拒绝,在我的周控制器中,我有以下几行用于迭代选定的周,查找相应的用户并向每个用户发送电子邮件:
elsif params[:commit] == "Reject selected weeks"
user_week = Week.where(id: params[:weeks_ids])
user_week.update_all(approved?: false)
# fetch the set of user_emails by converting the user_weeks to user_ids
users = User.find(user_week.pluck(:user_id))
users.each do |user|
#iterate over the users and send each one an email
UserMailer.send_rejection(user).deliver
end
flash[:info] = "Selected weeks were Rejected."
end
redirect_to weeks_path
当我尝试拒绝一周时,收到以下错误消息:
undefined method `send_rejection' for UserMailer:Class
我添加了预先存在的代码并且对MVC知之甚少,因此我能想到的唯一问题是将邮件程序方法放在错误的文件中或者将错误类型的arg发送到邮件方法。 这是" send_rejection",我的用户模型中包含的邮件程序。
def send_rejection(user)
UserMailer.reject_timesheet(user).deliver_now
end
我的user_mailer.rb文件中的相应方法:
def reject_timesheet(user)
@greeting = "Hi"
mail to: user.email, subject: "Rejected Timesheet"
end
铁杆新手并不确定我哪里出错了。
答案 0 :(得分:2)
这不是MVC的问题,我可能会问的一个问题是你为什么不直接拨打reject_timesheet
而不是send_rejection
。
您正在收到错误,因为正如您所说,该方法是在用户模型中定义的,因此为了调用该方法,您需要执行以下操作:
user.send_rejection
在这种情况下,我怀疑您是否需要将用户参数传递给send_rejection
,就像您可以这样做:
class User
def send_rejection
UserMailer.reject_timesheet(self).deliver_now
end
end
然后在你的控制器中:
...
users.each do |user|
#iterate over the users and send each one an email
user.send_rejection
end
...
我相信你也可以稍微清理你的代码库并重构一些逻辑,但基本上这种方法应该可以解决你的错误。
如果有帮助,请告诉我