ruby-on-rails - rails 方式 : Formatting Value Before Setting it in the Model?

标签 ruby-on-rails activerecord

我有用户输入的表单字段:

  • 百分比:50.5%
  • 钱:$144.99
  • 日期:Wednesday, Jan 12th, 2010

  • ...
    percentmoney类型属性保存为 decimal带有 ActiveRecord 的字段,日期为 datetimedate字段。

    javascript中格式之间的转换很容易,理论上可以转换成activerecord可接受的格式onsubmit ,但这不是一个体面的解决方案。

    我想做一些覆盖 ActiveRecord 中的访问器的事情,所以当它们被设置时,它会将它们从任何字符串转换为适当的格式,但这也不是最好的。

    我不想要的是必须通过一个单独的处理器对象来运行它们,这需要在 Controller 中执行类似的操作:
    def create
      # params == {:product => {:price => "$144.99", :date => "Wednesday, Jan 12, 2011", :percent => "12.9%"}}
      formatted_params = Product.format_params(params[:product])
      # format_params == {:product => {:price => 144.99, :date => Wed, 12 Jan 2011, :percent => 12.90}}
      @product = Product.new(format_params)
      @product.save
      # ...
    end
    

    我希望它完全透明。 ActiveRecord 中的钩子(Hook)在哪里,所以我可以用 Rails 方式做到这一点?

    更新

    我现在只是这样做:https://gist.github.com/727494
    class Product < ActiveRecord::Base
      format :price, :except => /\$/
    end
    
    product = Product.new(:price => "$199.99")
    product.price #=> #<BigDecimal:10b001ef8,'0.19999E3',18(18)>
    

    最佳答案

    您可以使用验证前 Hook 来规范化您的参数,例如 before_validation

    class Product < ActiveRecord::Base
    
         before_validation :format_params
    
    
          .....
    
    
         def format_params
            self.price = price.gsub(/[^0-9\.]/, "")
            ....
         end
    

    关于ruby-on-rails - rails 方式 : Formatting Value Before Setting it in the Model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349254/

    相关文章:

    ruby-on-rails - 如何设置 Rails 验证列 hstore 键的唯一性?

    mysql - 从三个嵌套表中选择所有行

    php - 使用 google.com/tbproxy/spell 检查拼写

    ruby-on-rails - 在 Rails 模型中是否应该避免任何 'protected' 名称?

    ruby-on-rails - 使用 block 而不是散列来初始化 activerecord 对象有什么好处?

    Mysql2::错误:字段 'teacherid' 没有默认值:INSERT INTO `students` VALUES ()

    activerecord - 如何在 Yii 中验证价格(金额)mySql 十进制列?

    ruby-on-rails - Ruby lambda 执行与规范中的 should

    ruby-on-rails - 编写方法时遇到问题

    ruby-on-rails - 简化模型中的代码