2017-03-02 15 views
0

我有一個應用程序,在這周可以批准或拒絕對象,這是在周控制器中完成的。我的一週模特屬於用戶。下面是我在做什麼在本週控制器很短的例子:屬於用戶的模型,無法訪問user_id

第一塊提供了一些背景:

def approve 
@user = current_user 
if params[:commit] == "Approve selected weeks" 
    Week.where(id: params[:weeks_ids]).update_all(approved?: true) 
    flash[:success] = "Selected weeks were approved!" 
    #Send an email noting it was approved 
    @user.send_approved(current_user) 

下面是成功的一半拒絕:

elsif params[:commit] == "Reject selected weeks" 
    user_week = Week.where(id: params[:weeks_ids]) 
    user_week.update_all(approved?: false) 

以上,這幾周完全更新。下面,我嘗試從選定的一週中檢索用戶,以便我可以向該用戶發送電子郵件。

#get the user associated with the rejected week, send them an email. 
    user_email = User.find(id: user_week.user_id) 
    UserMailer.send_rejection(user_email).deliver 

    flash[:info] = "Selected weeks were Rejected." 
    end 
    redirect_to weeks_path 
end 

當我嘗試但拒絕一個星期,我收到以下錯誤:

undefined method `user_id' for <Week::ActiveRecord_Relation:0x007fdcac43e730> 

這是由於未指定的用戶對象?

+0

注 - 我加入到預先存在的代碼在這裏,並有MVC不甚瞭解或滑軌語法。我一整天都在瀏覽堆棧溢出,不知何故沒有發現任何看起來一樣的東西,但我肯定會誤會。 – CodeBoy

回答

1

Week::ActiveRecord_Relation記錄集,不只是一個單一的一個......它就像一個數組,這將不完全工作,你所希望的方式上調用user_id

你想要的是調用user_id上的Week 單個實例要做到這一點,您可以:

一)取了一個星期(您想可能不是)

b)運行each上的Active關係例如:

user_weeks.each do |user_week| 
    #get the user associated with the rejected week, send them an email. 
    user_email = User.find(user_week.user_id) 
    UserMailer.send_rejection(user_email).deliver 
end 

c)中通過轉換user_weeks到user_ids取該組的USER_EMAILS(但隨後迭代的電子郵件),例如:

# get the user associated with the rejected week, send them an email. 
users = User.find(user_weeks.pluck(:user_id)) 
users.each do |user| 
    UserMailer.send_rejection(user).deliver 
end 

d)假設它總是在相同的用戶呢,只是使用的第一週如:

#get the user associated with the rejected week, send them an email. 
    user_email = User.find(user_week.first.user_id) 
    UserMailer.send_rejection(user_email).deliver 
+0

原諒我的無知,但我現在有以下錯誤:「選擇一個與第七個用戶關聯的星期時,找不到具有'id'= {:id => [7]}的用戶」。這個問題的答案是否對評論過於冗長? – CodeBoy

+0

哦,是的......'find'不需要你使用'id',我只是複製你的代碼。我會更新我的答案。 –

+1

謝謝!現在看來我對我的郵件程序有問題了。「未定義的方法send_rejection爲UserMailer:Class」,但這對於一個新問題來說確實足夠了。 – CodeBoy

1

user_week似乎是周的集合,而不是一個單一的一週。

你可能要找的是發送多個拒絕電子郵件。您可以通過在user_weeks所有周循環,並通過做發送多封電子郵件:

elsif params[:commit] == "Reject selected weeks" 
    user_weeks = Week.where(id: params[:weeks_ids]) 
    user_weeks.update_all(approved?: false)  
    user_weeks.each do |w| 
     user_email = User.find(id: w.user_id) 
     UserMailer.send_rejection(user_email).deliver 
    end 
    flash[:info] = "Selected weeks were Rejected." 
    end 
    redirect_to weeks_path 
end