2012-01-25 18 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的逻辑和控制流更好的主意。模型操纵数据(业务逻辑层),控制器向业务逻辑层传递信息和视图显示信息。

相关问题