【问题标题】:How to calculate difference of two fields on form submit Ruby on Rails如何计算表单上两个字段的差异提交Ruby on Rails
【发布时间】:2009-08-25 18:56:57
【问题描述】:

我是 Ruby on Rails 的新手,一直在使用 Scaffolding。在其中一个表单上,我希望能够有两个字段,然后将两者之间的差异提交到数据库。

我希望计算(结束金额 - 起始金额)而不是 :pickupamount,并将其输入到我的数据库的pickupamount 列中。

提前致谢!

【问题讨论】:

    标签: ruby-on-rails forms math scaffolding


    【解决方案1】:

    您可以在模型或控制器中执行此操作。与Skinny Controller Fat Model 一起使用,将功能放入模型中可能会更好。查看ActiveRecord callbacks

    class MyModel < ActiveRecord::Base
      attr_accessor :start_amount, :end_amount
      before_create :calculate_pickup_amount
    
      private
        def calculate_pickup_amount
          self.pickupamount = end_amount.to_i - start_amount.to_i
        end
    end
    

    然后,在您的控制器中:

    def create
      # Assuming params[:my_model] has all the data for initializing a MyModel,
      # including start_amount and end_amount but not pickupamount:
      my_model = MyModel.new(params[:my_model])
    
      if my_model.save
        # Yay, do something
      else
        # Fail, do something else
      end
    end
    

    将以下扩展方法包含到 Ruby 的 String 类(感谢 sikelianos)中可能会很有用,可能在 Rails 应用程序的 lib 目录中的文件中:

    class String
      def numeric?
        Float self rescue false
      end
    end
    

    那么你可以在设置pickupamount之前进行检查:

    def calculate_pickup_amount
      if end_amount.numeric? && start_amount.numeric?
        self.pickupamount = end_amount.to_i - start_amount.to_i
      else
        # Throw exception, set some default value, etc.
      end
    end
    

    【讨论】:

    • 谢谢莎拉,只是偶然发现了这个寻找类似问题的答案。 ActiveRecord 回调正是我解决问题所需要的。
    【解决方案2】:

    在你看来:

    form_tag '/some_action' do
        text_field_tag 'start_amount'
        text_field_tag 'end_amount'
    end
    

    在您的控制器中:

    def create
        model = Model.new
        model.pickupamount = params[:end_amount].to_i - params[:start_amount].to_i
        model.save!
    end
    

    【讨论】:

    • 问题中提到了Ending Amount - Starting Amount,而你显示的正好相反。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多