我有一个公式,根据是否有衬垫计算出价格,我需要总计所有项目。我猜我应该把这个公式添加到控制器中,这样我就可以得到总和,但我似乎无法弄清楚如何将它添加到模型中。
模型##这不起作用##
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 %>
我以为我需要在模型中使用两个公式...一个用于w /衬里,一个用于w / o衬里。然后当我将它们添加到视图中时,我可以得到每个的总和。
每当我尝试使用模型时,我都无法正确使用...
感谢您的帮助!
答案 0 :(得分:0)
首先在模型中定义您的方法:
.execute()
要测试它,请打开rails控制台,转到您的app文件夹并输入:
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
x = list(range(0, 5))
y = [[2.00000000e-01, 2.00000000e-01, 2.75495888e-02,
1.40100625e-02, 2.00000000e-01], [1.40100625e-02,
3.85989938e-01, 6.20454173e-03, 1.74945474e-03,
2.00000000e-01], [1.74945474e-03, 3.98250545e-01,
1.24956950e-03, 2.30229281e-04, 2.00000000e-01],
[2.30229281e-04, 3.99769771e-01, 2.26476892e-04,
3.05018276e-05, 2.00000000e-01], [3.05018276e-05,
3.99969498e-01, 3.82455658e-05, 4.04459287e-06,
2.00000000e-01]]
fig, ax = plt.subplots()
sc = ax.scatter(x,y[0])
plt.ylim(-0.1,0.5)
def animate(i):
sc.set_offsets(np.c_[x,y[i]])
ani = matplotlib.animation.FuncAnimation(fig, animate,
frames=len(y), interval=300, repeat=True)
plt.show()
在控制台内部,获取一个实例并尝试使用您的方法:
#File: app/models/client.rb
class Client < ActiveRecord::Base
def liner
# your code here
end
end
这样,您正在测试您的mehtod是否正常工作。稍后您可以在控制器或视图中使用它。
答案 1 :(得分: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>