如何根据会话/ cookie返回Rails中的虚拟属性

时间:2013-11-11 13:24:04

标签: ruby-on-rails ruby cookies

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

P.S。如果还有另一种“正确”的方式让这件事成功 - 请教我。

2 个答案:

答案 0 :(得分:1)

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

实际上它更有意义:辅助方法不应该对用户cookie有任何了解,尽量保持它们尽可能纯净!

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

答案 1 :(得分:0)

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