重返Ruby之路 Day20 --- Rails7学习(7)

196 阅读2分钟

使用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 值组成(这个概念被数据库设计者称为外键) ,那么相应的模型应该为每个表都有一个属于 _ 的值。