Как рассчитать разницу двух полей в форме отправки Ruby on Rails - PullRequest
2 голосов
/ 25 августа 2009

Я новичок в Ruby on Rails и использую Scaffolding. В одной из форм я хочу иметь два поля, а затем иметь разницу между двумя, представленными в базе данных.

Вместо: pickupamount, я хочу, чтобы (Конечная сумма - Начальная сумма) была рассчитана и введена в столбец pickupamount моей базы данных.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 25 августа 2009

Вы можете сделать это либо в вашей модели, либо в вашем контроллере. В дополнение к 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
0 голосов
/ 25 августа 2009

На ваш взгляд:

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
...