Вы можете сделать это либо в вашей модели, либо в вашем контроллере. В дополнение к 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
Может быть полезно включить следующий метод расширения в класс String
Руби (благодаря sikelianos ), возможно, в файле в каталоге lib вашего Rails-приложения:
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