我是 Ruby on Rails 的新手,一直在使用 Scaffolding。在其中一个表单上,我希望能够有两个字段,然后将两者之间的差异提交给数据库。
我希望计算(结束金额 - 起始金额)而不是 :pickupamount 并将其输入到我的数据库的pickupamount 列中。
提前致谢!
我是 Ruby on Rails 的新手,一直在使用 Scaffolding。在其中一个表单上,我希望能够有两个字段,然后将两者之间的差异提交给数据库。
我希望计算(结束金额 - 起始金额)而不是 :pickupamount 并将其输入到我的数据库的pickupamount 列中。
提前致谢!
您可以在模型或控制器中执行此操作。与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
在您看来:
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