2012-01-25 63 views
0

我有帶的has_many獎勵上的一定值時,獎勵屬於帶。Rails 3中,如何寫一個控制器/模型的方法來扣除基於相關聯的對象

在樂隊演出頁我循環通過波段獎勵:

<% @rewards.each do |r| %> 
    <b>Reward:</b> <%= r.name %><br> 
    <b>Cost:</b> <%= r.cost %><br> 
    <%= button_to "Get This", buy_item_band_path(@band, @reward)%> 
<% end %> 

buy_item_band_path路線波段#buy_item行動。我將@band和「r」傳遞給它,以便我可以訪問這兩者。

我處理用戶設計,所以我有機會獲得CURRENT_USER爲好。基本上我試圖讓用戶購買獎勵。用戶有一個點的屬性,所以我試圖做類似的帶產品型號如下:

def pay_for_it 
    unless current_user.points < self.reward.cost 
    current_user.points - self.reward.cost 
    current_user.save 
    # SEND TWO EMAILS ONE TO THE PURCHASER AND ONE TO THE BAND ADMIN 
    end 
end 

該模型方法正是我認爲可能的工作,但我不知道如何引用它控制器,不知道我是否應該,不知道我是否應該以某種方式在控制器中執行此操作。

任何幫助,非常感謝。

感謝

回答

0

首先,如果你想通過獎勵,該代碼也許應該讀作:

<%= button_to "Get This", buy_item_band_path(@band, r)%> 

我不知道什麼@reward會已經從拉動,但r將從當前迭代@rewards拉。

至於這個問題,所有的業務邏輯都應該發生在你的模型中。控制器只是將數據傳遞到模型中,分析模型操作的結果,並告訴Rails哪些視圖需要顯示。

這聽起來像你的用戶是做支付對象,所以您的付款方式可能屬於在用戶模式,應採取獎勵作爲其唯一的參數。根本沒有明確的理由涉及Band模型。

處理這個請求可能會是這個樣子的你的控制器的部分:

def buy_item 
    reward = Reward.find(params[:reward_id]) 
    if current_user.pay_for_it(reward) 
    # Send emails and then... 
    # Render something 
    else 
    # Render something that indicates an error happened 
    # or that the user didn't have enough points. 
    end 
end 

和用戶模式會碰到這樣的:

def pay_for_it(reward) 
    return false unless self.points >= reward.cost 

    current_user.points -= reward.cost 
    current_user.save 
end 

所以User#pay_for_it會,如果返回true積分已成功扣除,此時您的控制器可以發送電子郵件,然後呈現購買成功後應顯示的任何視圖。

希望這會給你如何組織在Rails的邏輯和控制流更好的主意。模型操縱數據(業務邏輯層),控制器向業務邏輯層傳遞信息和視圖顯示信息。

相關問題