0

我有一本模型书。它具有属性 - 名称、作者、价格。另外,我在网站上有货币转换器。我想根据用户选择的货币格式化价格。Ruby 有 number_to_currency 函数,但这不是我想要的,因为我需要特殊格式的价格(对于俄语,我们有:1 рубль、2 рубля、5 рублей)。因此,我将虚拟属性 price_formatted。

def price_formatted
  case cookie[:currency]
  when 'usd'
    '<span>$'+price.to_s+'</span>'
  when 'eur'
    '<span>&euro;'+price.to_s+'</span>'
  else
    '<span>'+price.to_s+'</span> '+Russian.p(price, 'рубля', 'рублей', 'рублей')
  end
end

Russian.p 对数字进行俄语复数。错误是在 price_formatted 函数中未定义 cookie。

PS如果有另一种“正确”的方法可以使这件事起作用-请教我。

4

2 回答 2

1

我认为您应该将 cookie[:currency] 值作为参数传递给此辅助方法。

实际上,这更有意义:辅助方法不应该知道任何关于用户 cookie 的信息,尽量保持它们的纯净!

编辑:哦,这是一种模型方法吗?你称之为虚拟属性,所以我假设是这样。然后,您应该将其转换为视图助手。在模型类中包含表示逻辑是没有意义的。在 helpers 文件夹下创建 book_helper.rb,并将该方法放入其中。

于 2013-11-11T13:32:37.463 回答
0

与其在模型中定义虚拟属性,我更喜欢使用装饰器模式来控制属性在视图中的显示方式。你可以看看这个 gem https://github.com/drapergem/draper。在draper里面,可以访问cookie、session等。

于 2013-11-11T13:43:06.510 回答