我是新来的Ruby on Rails和已经使用脚手架。在其中一种形式中,我希望能够拥有两个字段,然后将两个字段提交给数据库。如何计算形式两个领域的差异提交Ruby on Rails的
相反的:pickupamount,我想(期末数 - 起始量)来计算,并进入我的数据库的pickupamount列。
在此先感谢!
我是新来的Ruby on Rails和已经使用脚手架。在其中一种形式中,我希望能够拥有两个字段,然后将两个字段提交给数据库。如何计算形式两个领域的差异提交Ruby on Rails的
相反的:pickupamount,我想(期末数 - 起始量)来计算,并进入我的数据库的pickupamount列。
在此先感谢!
在你看来:
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
你可以在任何模型或控制器做到这一点。与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
感谢萨拉,只是碰到这种偶然寻找一个答案,一个simliar问题。 ActiveRecord回调正是我需要解决我的问题。 – brad 2010-04-18 23:48:54
问题提到期末数 - 起始量,并告诉你相反。 – 2009-08-25 19:38:50
纠正了,感谢萨拉 – 2009-08-25 19:50:15