使用helper格式化价格
Ruby 提供了一个 sprintf ()函数,可以用来格式化价格。我们可以在视图中直接放置使 用这个函数的逻辑。例如:
<%= sprintf("$%0.02f", product.price) %>
这是可行的,但它将货币格式的知识嵌入到视图中。如果我们在几个地方显示产品的价格,并希望以后将应用程序国际化,这将造成一个维护问题。
相反,让我们使用一个 helper 方法将价格格式化为货币。Rails 内置了一个合适的方法,叫做 number _ to _ currency ()。
在视图中使用 helper 只是将其作为常规方法调用的问题; 在索引模板中,我们从以下代码开始:
<%= product.price %>
也就是改为:
`<%= number_to_currency(product.price) %>
创建购物车
`
depot> bin/rails generate scaffold Cart
...
depot> bin/rails db:migrate
module CurrentCart
private
def set_cart
@cart = Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
@cart = Cart.create
session[:cart_id] = @cart.id
end
end
Set _ cart ()方法首先从会话对象获取: cart _ ID,然后尝试找到与此 ID 对应的 cart。 如果没有找到这样的购物车记录(如果 ID 为空或由于任何原因无效,就会发生这种情 况) ,该方法将继续创建一个新购物车,然后将创建的购物车的 ID 存储到会话中。
注意,我们将 set _ cart ()方法放在 CurrentCart 模块中,并将该模块放在app/controllers/concerns 目录中的一个新文件中。这种处理方式允许我们共享公共 代码(即使只有一个方法)在控制器之间。
另外,我们把这个方法标记为 private,这样 Rails 就不能把它作为控制器上的一个操作来使用。
将产品连接到 cart
depot> bin/rails generate scaffold LineItem product:references cart:belongs_to
...
depot> bin/rails db:migrate
class LineItem < ApplicationRecord
belongs_to :product
belongs_to :cart
end
Belong _ to ()方法定义了一个访问器方法——在本例中是 cart ()和 products ()——但 更重要的是,它告诉 Rails line _ items 中的行是 cart 和 products 中的行的子级。除非 对应的购物车和产品行存在,否则没有行项可以存在。一个很好的经验法则是: 如果一个表有任何列,其值由另一个表的 ID 值组成(这个概念被数据库设计者称为外键) ,那么相应的模型应该为每个表都有一个属于 _ 的值。