0

我有一個應用程序,用戶提交可以批准或拒絕的星期,並且在我的星期控制器中,我有以下幾行代碼用於遍歷選定的幾周,找到相應的用戶併發送每個用戶的電子郵件:UserMailer的未定義方法:類

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的小知識,所以我能想到的唯一問題就是放置郵件方法d輸入錯誤的文件或將不正確的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

您是否嘗試過放置send_rejection方法內部user_mailer.rb而不是用戶模式?我想使用UserMailer。使它看起來在那裏。或者只是做UserMailer.reject_timesheet。 –

+0

兇手,你是對的 – CodeBoy

+1

大寫的位是調用該文件。用戶。調用用戶模型,UserMailer調用userMailer(它位於文件的最頂端)。 –

回答

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

,我相信你也可以清理你的codebase有點並可能重構一些邏輯,但基本上這種方法應該可以解決你的錯誤。

讓我知道這是否有助於

+0

謝謝! @Rockwell提出了類似的修復方法,並且工作。我會給這個更詳細的方法一個鏡頭,並在一秒鐘內接受 – CodeBoy

+0

工作很好,謝謝你的解釋! – CodeBoy

相關問題