如何在 Rails 中返回虚拟属性,具体取决于会话/cookie



我有一本模型书。它具有属性 - 名称,作者,价格。另外,我在网站上有货币切换器。我想根据用户选择的货币格式化价格。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

俄语.p使数字的俄语复数。错误是price_formatted函数中未定义cookie。

附言如果有另一种"正确"的方法可以让这件事工作 - 请教我。

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

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

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

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

最新更新