Ruby on rails 保存前,rails 5未按预期工作

Ruby on rails 保存前,rails 5未按预期工作,ruby-on-rails,Ruby On Rails,在我的模型中有一个before_保存,可以将逗号转换为点,这很好。但不知怎的它坏了。示例:用户输入1,22,存储的值不带小数,如1.00 我需要将值存储为十进制,即使用户键入逗号而不是点。因为逗号是分隔符 before_save { self.price.to_s.gsub(',', '.').to_f } 我还尝试改变这一点: before_save :convert_comma private def convert_comma self.price = self.pr

在我的模型中有一个before_保存,可以将逗号转换为点,这很好。但不知怎的它坏了。示例:用户输入1,22,存储的值不带小数,如1.00

我需要将值存储为十进制,即使用户键入逗号而不是点。因为逗号是分隔符

before_save { self.price.to_s.gsub(',', '.').to_f }
我还尝试改变这一点:

before_save :convert_comma

private

  def convert_comma
      self.price = self.price.to_s.gsub(',', '.').to_f 
  end
我在控制台中测试了上面的逗号替换,它可以工作,但是在保存之前,数据会四舍五入地存储,如1.00

Rails控制台:

2.3.4:001>p=Ticket.new(“司机身份证”=>“3”,“始发身份证”=>“AP”,“始发城市身份证”=>“阿马帕”,“目的地身份证”=>“GO”,“目的地城市身份证”=>“阿巴迪亚德戈瓦斯”,“开始日期”=>“2017年12月29日19:28”,“返回日期”=>“2017年12月29日19:28”,“注释”=>“1”,“费率”=>“1”,“价格”=>“1233,22”,“状态”=>“阿贝托”)
=> #  

2.3.4:002>p.save
(0.2ms)保存点活动记录1
SQL(0.6ms)插入“票证”(“开始日期”、“返回日期”、“费率”、“价格”、“注释”、“状态”、“起点id”、“终点id”、“司机id”、“创建日期”、“更新日期”、“起点城市id”、“终点城市id”)值(?,,,,,,,,,,,,,,,,)[“开始日期”,“2017-12-29 19:28:00”,“返回日期”,“2017-12-29 19:28:00”][“费率”、“1.0”、“价格”、“1233.0”、“注释”、“1”]、[“状态”、“阿伯托”]、[“起点id”、“AP”]、[“终点id”、“GO”]、[“驾驶员id”、“3”]、“创建地点”、“2017-12-29 21:55:22.119679”]、[“更新地点”、“2017-12-29 21:55:22.119679”]、[“起点城市id”、“阿马帕”]、[“终点城市id”、“阿巴德戈瓦”]
(0.1ms)释放保存点活动\u记录\u 1
=>正确

这真的很奇怪,你知道会发生什么吗?
谢谢!

我不确定是否理解了您的问题,我认为错误是试图在数字类型上转换“,”in“。您可以在视图中使用NumberHelper方法更改打印方式,例如:

<%= number_with_delimiter(@product.price, delimiter: ",", separator: ".") %>

分隔符表示千,分隔符表示小数,如果是货币,可能是更好的数字-货币方法

<%= number_to_currency(@product.price, delimiter: ".", separator: ",", unit: "€") %>

编辑

再次编辑 由于您需要允许用户使用逗号作为分隔符,我建议您自己查找或编写一个18n文件,放入您的config/locales文件夹中,对于巴西,它应该是br.yml。在语音“number:”处,您可以设置货币和格式,并设置分隔符和分隔符。 要默认设置此文件,请在config/application.rb上添加以下行:

module YourApp
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
    config.i18n.default_locale = :br
  end
end
moduleyourapp
类应用程序
然后,您的数字_字段需要有正确的步骤选项:

<%= f.number_field :price, step: 0.01 %>


这应该可以正常工作,还允许您翻译系统消息:)

我不确定是否理解您的问题,我认为错误是试图在数字类型上转换“,”in“。您可以在视图中使用NumberHelper方法更改打印方式,例如:

<%= number_with_delimiter(@product.price, delimiter: ",", separator: ".") %>

分隔符表示千,分隔符表示小数,如果是货币,可能是更好的数字-货币方法

<%= number_to_currency(@product.price, delimiter: ".", separator: ",", unit: "€") %>

编辑

再次编辑 由于您需要允许用户使用逗号作为分隔符,我建议您自己查找或编写一个18n文件,放入您的config/locales文件夹中,对于巴西,它应该是br.yml。在语音“number:”处,您可以设置货币和格式,并设置分隔符和分隔符。 要默认设置此文件,请在config/application.rb上添加以下行:

module YourApp
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
    config.i18n.default_locale = :br
  end
end
moduleyourapp
类应用程序
然后,您的数字_字段需要有正确的步骤选项:

<%= f.number_field :price, step: 0.01 %>


这应该是可行的,还允许您翻译系统消息:)

我在这里找到了一个解决方法,并修改为:

before_save :pricecomma

def pricecomma
  price     
end

def pricecomma=(price)
  self.price = price.gsub(',', '.') unless price.blank?
end
将我的表格更改为:

<%= f.text_field :pricecomma %>


仍然不知道发生了什么。我尝试了没有此虚拟属性的相同代码,但没有得到替换。但是这种方法很好。

我在这里找到了解决方法,并修改为:

before_save :pricecomma

def pricecomma
  price     
end

def pricecomma=(price)
  self.price = price.gsub(',', '.') unless price.blank?
end
将我的表格更改为:

<%= f.text_field :pricecomma %>


仍然不知道发生了什么。我尝试了没有这个虚拟属性的相同代码,但没有得到替换。但是这种方法很好。

这里的问题是,当您在初始值设定项(Ticket.new)中写入属性时,active record会将字符串强制转换为BigDecimal。请注意,在控制台输出中,您的实例为price属性保留一个值为“0.1233E4”而不是“0.123322e4”的BigDecimal。这意味着:convert_逗号方法运行时:

self.price.to_s #=> '1233.0'
一种可能的解决方案是在模型中重写属性编写器,在ticket.rb文件中编写以下实例方法:

def price=(new_price)
  super(BigDecimal.new(new_price.to_s.gsub(',', '.')))
end

这里的问题是,只要您在初始值设定项(Ticket.new)中写入属性,活动记录就会将字符串强制转换为BigDecimal。请注意,在控制台输出中,您的实例为price属性保留一个值为“0.1233E4”而不是“0.123322e4”的BigDecimal。这意味着:convert_逗号方法运行时:

self.price.to_s #=> '1233.0'
一种可能的解决方案是在模型中重写属性编写器,在ticket.rb文件中编写以下实例方法:

def price=(new_price)
  super(BigDecimal.new(new_price.to_s.gsub(',', '.')))
end

谢谢您的时间。问题是在巴西,人们键入逗号而不是点作为分隔符。即使用户键入