【问题标题】:Undefined method for UserMailer:ClassUserMailer:Class 的未定义方法
【发布时间】:2017-07-24 01:44:38
【问题描述】:

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

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

刚接触rails,不知道哪里出错了。

【问题讨论】:

  • 您是否尝试过将 send_rejection 方法放在 user_mailer.rb 而不是 User 模型中?我认为使用 UserMailer。让它看起来在那里。或者只是做 UserMailer.reject_timesheet。
  • 杀手,你是对的
  • 大写位正在调用该文件。用户。调用用户模型,UserMailer 正在调用 userMailer(这是在文件的最顶部)。

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


【解决方案1】:

这不是 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
...

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

如果有帮助请告诉我

【讨论】:

  • 谢谢! @Rockwell 提出了一个类似的修复方法,它奏效了。我会给这个更详细的方法一个镜头,并在几秒钟内接受
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2013-06-11
  • 2010-12-30
  • 2019-12-25
  • 2021-07-25
相关资源
最近更新 更多