2012-01-25 12 views
0

私はバンドhas_many報酬、報酬はバンドに属しています。バンド#1 buy_itemアクションに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ルート:私はバンドの報酬をループしていますバンドのショーのページで

。私は両方にアクセスできるように@bandと "r"を渡しています。

私はDeviseでユーザーを処理しているので、私も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に伝えるだけです。

あなたのユーザーは支払いを行っているオブジェクトなので、支払い方法はUserモデルに属している可能性があり、唯一のパラメータとして報酬を取る必要があります。バンドモデルを組み込む明確な理由は全くありません。

このリクエストを処理して、コントローラの部分は、おそらくこのようなものになります。

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 

をし、ユーザーモデルのようなものがあります:あればUser#pay_for_itはtrueを返します

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

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

をあなたのコントローラが電子メールを送信して、購入が成功した後に表示する必要があるビューをレンダリングすることができる時点で、ポイントが首尾よく差し引かれました。

これで、Railsでロジックを整理し、フローを制御する方法がわかります。モデルはデータ(ビジネスロジックレイヤー)を操作し、コントローラーはビジネスロジックレイヤーとの間で情報をやりとりし、ビューは情報を表示します。

関連する問題