Vous pouvez le faire soit dans votre modèle ou votre contrôleur. En allant avec Skinny Controller Fat Model, il pourrait être préférable de mettre la fonctionnalité dans votre modèle. Découvrez 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
Ensuite, dans votre contrôleur:
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
Il pourrait être utile d'inclure la méthode d'extension suivante classe Ruby String
(les grâce à sikelianos), peut-être dans un fichier dans le répertoire lib de votre application Rails :
class String
def numeric?
Float self rescue false
end
end
Ensuite, vous pouvez effectuer une vérification avant de 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
La question indique Montant final - Montant de départ, et vous montre le contraire. –
corrigé cela, merci Sarah –