2017-03-13 32 views
0

私は、それがライナーを持っているかどうかに基づいて価格を計算し、すべてのアイテムを合計する必要がある式を持っています。私はその数式を取ってコントローラに加えて合計を得るべきだと推測していますが、それをモデルに追加する方法を見つけることはできません。Rails - 計算の合計

モデル##これが動作しない##

def liner 
(((2 * order_item.length) + (2 * order_item.width)) * order_item.height + (order_item.length + order_item.width)) * current_user.company.rate 
end 

コントローラ

def edit 
    @order = Order.find(params[:id]) 
    @order_items = OrderItem.where(order_id: @order) 
end 

ビュー##下##

<% if @order_items.exists? %> 
    <div class="well"> 

    <% @order_items.each do |order_item| %> 
     <div class="table-responsive"> 
     <table class="table table-striped"> 
      <tbody> 
      <tr> 
       <td> 
       <%= order_item.liner.present? ? (order_item.fitting.name + ' w/ Liner') : order_item.fitting.name %> 
       </td> 
       <td> 
       <%= order_item.length %>"L 
        <%= order_item.width %>"W 
        <%= order_item.height %>"H 
       </td> 
       <td><%= order_item.quantity %> @ (<%= order_item.liner.present? ? number_to_currency((((2 * order_item.length) + (2 * order_item.width)) * order_item.height + (order_item.length + order_item.width)) * current_user.company.rate) : number_to_currency((((2 * order_item.length) + (2 * order_item.width)) * order_item.height) * current_user.company.rate) %>) =</td> 
       <td> 
       <td><%= order_item.liner.present? ? number_to_currency(((((2 * order_item.length) + (2 * order_item.width)) * order_item.height + (order_item.length + order_item.width)) * current_user.company.rate) * order_item.quantity) : number_to_currency(((((2 * order_item.length) + (2 * order_item.width)) * order_item.height) * current_user.company.rate) * order_item.quantity) %></td> 
       <td> 
       <%= link_to '<i class="material-icons">clear</i>'.html_safe, order_item, class: 'btn btn-xs btn-danger', role: 'button', method: :delete, data: { confirm: 'Are you sure?' } %> 
       </td> 
      </tr> 
      </tbody> 
     </table> 
     </div> 

     <% end %> 
    <p><%= @order_items.sum(&:liner) %> 
    </p> 
    </div> 
    <% end %> 
の合計を除いて、このすべての作品

私はモデルに2つの式が必要だと思っていました... 1つはライナー用、もう1つはライナーなしです。そして、それらをビューに追加すると、それぞれの合計を得ることができます。

私はモデルを使用してみてくださいたびに、私はあなたの助けのための

おかげで...右のそれを得ることができません!

答えて

0

まず、モデルの内側にあなたの方法を定義します:1インスタンスを取得し、コンソール内

rails c 

#File: app/models/client.rb 

class Client < ActiveRecord::Base 
    def liner 
     # your code here 
    end 
end 

は、アプリのフォルダと型に移動し、レールコンソールを開き、それをテストするにはあなたの方法を試してみてください:

c = Client.find(1) 
c.liner 

この方法で、あなたのmehtodがうまく動作するかどうかをテストしています。後でそれをコントローラまたはビューで使用することができます。

+0

何か?私はすでにそれをする必要があると言いました.... – scottkekoa

+0

私はちょうど私がプロセスを始める方法を示した。最初に、Modelでメソッドを作成し、次に 'rails console'でその関数をチェックしてから、コントローラまたはビューでそのメソッドへの追加呼び出しを考えることができます。基本的な考え方は、最初にモデルメソッドの定義を解決し、それが正常に動作することを確認することです。 –

+0

あなたの投稿は可能な限り基本的なものでした...役に立たない。ごめんなさい! – scottkekoa

0

現在のライナー方法は、現在のユーザーにアクセスできないため機能しません。また、モデルメソッドでは、メソッド内でモデルインスタンスを使用しません。メソッドにユーザーを渡すことができます。

class OrderItem 
    def price_with_liner(user) 
    (((2 * length) + (2 * width)) * height + (length + width)) * user.company.rate 
    end 

ビューからロジックの一部を抽象化するには、ビューを読みやすくしてデバッグを容易にするヘルパーメソッドを作成できます。以下はあなたが始めるはずです。

ヘルパー/ order_items_helper.rb

module OrderItemsHelper 

    def price(order_item, user) 
    if order_item.liner.present? 
     number_to_currency(order_item.price_with_liner(user)) 
    else 
     number_to_currency(order_item.price_without_liner(user)) 
    end 
    end 

end 

ビューに追加する他の

<td><%= price(order_item, user) </td> 
+0

今日はチャンスがあるときにこれをチェックします。ありがとうございました! – scottkekoa