Frage

Ich bin neu in Ruby on Rails und haben Gerüste im Einsatz. Auf einer der Formen möchte ich in der Lage sein, zwei Felder zu haben, und dann haben den Unterschied zwischen den beiden an die Datenbank übermittelt.

Statt: pickupamount, ich will (Ending Betrag - Startbetrag) berechnet und in die pickupamount Spalte meiner Datenbank eingegeben werden

.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

In Ihrer Ansicht:

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

In Ihrem Controller:

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

Andere Tipps

Sie können dies entweder in Ihrem Modell oder den Controller. Geht zusammen mit dünnem Controller-Fat Modell , könnte es besser die Funktionalität in Ihrem Modell zu setzen. Schauen Sie sich Active Rückrufe .

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

Dann in Ihrem Controller:

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

Es könnte nützlich sein, um die folgenden Erweiterungsmethode Rubys String Klasse gehören (dank Sikelianos < vielleicht in einer Datei in Ihrer Rails-App lib / a>),:

class String
  def numeric?
    Float self rescue false
  end
end

Dann könnte man eine Prüfung vor Einstellung pickupamount ausführen:

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
scroll top