UserMailer的未定义方法:Class

时间:2017-03-03 20:03:34

标签: ruby-on-rails ruby model-view-controller ruby-on-rails-5

我有一个应用程序,用户提交的周数可以被批准或拒绝,在我的周控制器中,我有以下几行用于迭代选定的周,查找相应的用户并向每个用户发送电子邮件:

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

铁杆新手并不确定我哪里出错了。

1 个答案:

答案 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
...

我相信你也可以稍微清理你的代码库并重构一些逻辑,但基本上这种方法应该可以解决你的错误。

如果有帮助,请告诉我