2

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

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

提前致谢!

4

2 回答 2

2

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

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
于 2009-08-25T19:38:00.990 回答
0

在您看来:

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
于 2009-08-25T19:23:42.203 回答