我有一本模特书。它有属性 - 名称,作者,价格。 此外,我在网站上有货币切换器。我想根据用户选择的货币格式化价格。 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>€'+price.to_s+'</span>'
else
'<span>'+price.to_s+'</span> '+Russian.p(price, 'рубля', 'рублей', 'рублей')
end
end
Russian.p使数字俄语多元化。错误是在price_formatted函数中没有定义cookie。
P.S。如果还有另一种“正确”的方式让这件事成功 - 请教我。
答案 0 :(得分:1)
我认为你应该将cookie [:currency]值作为参数传递给这个辅助方法。
实际上它更有意义:辅助方法不应该对用户cookie有任何了解,尽量保持它们尽可能纯净!
编辑:哦,这是一种模型方法吗?你称之为虚拟属性,所以我假设如此。您应该将其转换为视图助手。在模型类中包含表示性逻辑是没有意义的。在helpers文件夹下创建book_helper.rb,并将该方法放在其中。答案 1 :(得分:0)
我更喜欢使用装饰器模式来控制属性在视图中的显示方式,而不是在模型中定义虚拟属性。你可以看一下这个宝石https://github.com/drapergem/draper。在内部布局中,您可以访问cookie,会话等。