我的数据库中有十进制字段。用户可以输入两种格式的值:逗号或点(11,11或11.11)。
但MySQL只允许以'点'格式保存数据,所以我想在使用正则表达式保存之前处理数据:
sub(/,/,".")
我如何在Rails3中执行此操作?
答案 0 :(得分:15)
如果我理解正确,可以在控制器或模型中完成。我可能会使用模型中的before_save回调来实现以下方式:
class Item < ActiveRecord::Base
before_save :standardise_numbers
...
protected
# Called before this object is saved to the DB
def standardise_numbers
self.number.sub!(",", ".")
end
end
数字是您要转换的属性。
我假设您不需要将其转换回逗号表示以显示给用户?如果这样做,您可能需要查看Rails的国际化API,Il8n。它处理这类东西等等,所以绝对值得研究。
根据您的反馈,我的上述解决方案不起作用,因为数字已经转换,小数部分在传递到模型时丢失。可以在控制器中使用类似的代码来拦截和转换params散列本身中的数字:
class PostController < ActionController
before_filter :standardise_numbers, :only => [ :create, :update ]
def create
@post = Post.create(params[:post])
end
protected
# Intercepts the params hash
def standardise_numbers
params[:post][:number].sub!(",", ".")
end
end
这简化了创建和更新方法,允许您以通常的方式处理哈希。
答案 1 :(得分:0)
我玩了它并发现了这个:
假设在表单字段数字中,用户输入值'12,13'。
从表单转到PostController到'create'方法
class PostController < ApplicationController
def create
@post = Post.new(params[:post])
#on this step instance of Post model created, validated and filled with relevant values
#so @post.number == '12' #(decimal), it cuts ',13'
#we need to redefine @post.number
@post.number = params[:post][:number].gsub(/,/,'.').to_f # => 12.13
#and after that save the post
@post.save
end