使用Rails 4行项目的敏捷Web开发无法在购物车中正确添加

时间:2014-01-09 12:49:05

标签: ruby-on-rails ruby ruby-on-rails-4

我一直关注着使用Rails 4的敏捷Web开发一书,我已经达到了第10章 - 整理推车。

到目前为止,所有内容都运行良好,直到我更新购物车以显示单独商品和整个购物车的总价格。

以下是发生的事情的快照:

Current Cart Output

显然,价格应该显示为总价而不是并排显示。

以下是我的观点:

<% if notice %>
<p id="notice"><%= notice %></p>
<% end %>

<h2>Your Cart</h2>
<table>

<% @cart.line_items.each do |item| %>

<tr>
<td><%= item.quantity %>&times;</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;
}
}

我希望有一个简单的解决方案,任何帮助都将非常感激。

...谢谢

2 个答案:

答案 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你应该好好去。

*或者,由于这是一个小项目,您只需编辑原始迁移文件,删除数据库,然后再次运行所有迁移并重新播种,但这不是最佳实践方法。