2009-08-25 14 views

Répondre

0

À votre avis:

form_tag '/some_action' do 
    text_field_tag 'start_amount' 
    text_field_tag 'end_amount' 
end 

Dans votre contrôleur:

def create 
    model = Model.new 
    model.pickupamount = params[:end_amount].to_i - params[:start_amount].to_i 
    model.save! 
end 
+0

La question indique Montant final - Montant de départ, et vous montre le contraire. –

+0

corrigé cela, merci Sarah –

2

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 
+0

Merci Sarah, juste trébuché à travers cette recherche d'une réponse à un problème simliar. ActiveRecord Callbacks sont exactement ce dont j'avais besoin pour résoudre mon problème. – brad