我一直关注着使用Rails 4的敏捷Web开发一书,我已经达到了第10章 - 整理推车。
到目前为止,所有内容都运行良好,直到我更新购物车以显示单独商品和整个购物车的总价格。
以下是发生的事情的快照:
显然,价格应该显示为总价而不是并排显示。
以下是我的观点:
<% if notice %>
<p id="notice"><%= notice %></p>
<% end %>
<h2>Your Cart</h2>
<table>
<% @cart.line_items.each do |item| %>
<tr>
<td><%= item.quantity %>×</td>
<td><%= item.product.title %></td>
<td class="item_price"><%= number_to_currency(item.total_price) %></td>
</tr>
<% end %>
<tr class="total_line">
<td colspan="2">Total</td>
<td class="total_cell"><%= number_to_currency(@cart.total_price) %></td>
</tr>
</table>
<%= button_to 'Empty cart', @cart, method: :delete,
data: { confirm: 'Are you sure?' } %>
这是我的line_item模型:
class LineItem < ActiveRecord::Base
belongs_to :product
belongs_to :cart
def total_price
product.price * quantity
end
end
这是我的购物车型号:
class Cart < ActiveRecord::Base
has_many :line_items, dependent: :destroy
def add_product(product_id)
current_item = line_items.find_by(product_id: product_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(product_id: product_id)
end
current_item
end
def total_price
line_items.to_a.sum { |item| item.total_price }
end
end
这是造型:
.carts {
.item_price, .total_line {
text-align: right;
}
.total_line .total_cell {
font-weight: bold;
border-top: 1px solid #595;
}
}
我希望有一个简单的解决方案,任何帮助都将非常感激。
...谢谢
答案 0 :(得分:1)
line_items.collect(&:total_price).sum
而不是
line_items.to_a.sum { |item| item.total_price }
答案 1 :(得分:1)
请注意,购物车的总价格是订单项总价格的字符串,而不是数字总和。
第一个订单项的总价格为“5.99”和“5.99”的字符串连接。
看起来您可能将价格存储为字符串而非十进制值。
为了说明问题,
>> ["4.95", "5.95"].sum
=> "4.955.95"
检查您的schema.rb
并确保其中包含此条目:
create_table "products", force: true do |t|
t.string "title"
t.text "description"
t.string "image_url"
t.decimal "price", precision: 8, scale: 2
t.datetime "created_at"
t.datetime "updated_at"
end
如果你有
t.string "price"
你必须修改它。
这样做的正确方法是使用新的迁移*。在命令行中,发出
rails g migration change_data_type_for_price
并在生成的迁移文件中添加
change_column :products, :price, :decimal, precision: 8, scale: 2
然后运行rake db:migrate
你应该好好去。
*或者,由于这是一个小项目,您只需编辑原始迁移文件,删除数据库,然后再次运行所有迁移并重新播种,但这不是最佳实践方法。