Como calcular diferença de dois campos no formulário de envio Ruby on Rails
-
19-09-2019 - |
Pergunta
Eu sou novo para Ruby on Rails e têm vindo a utilizar andaimes. Em uma das formas que eu quero ser capaz de ter dois campos e, em seguida, tem a diferença entre os dois submetidas ao banco de dados.
Em vez de: pickupamount, eu quero (que termina Montante - montante de partida) a ser calculado e entrou em coluna pickupamount de meu banco de dados
.Agradecemos antecipadamente!
Solução
Na sua opinião:
form_tag '/some_action' do
text_field_tag 'start_amount'
text_field_tag 'end_amount'
end
Em seu controlador:
def create
model = Model.new
model.pickupamount = params[:end_amount].to_i - params[:start_amount].to_i
model.save!
end
Outras dicas
Você pode fazer isso em qualquer modelo ou seu controlador. Indo junto com magro Controlador Gordo Modelo , pode ser melhor para colocar a funcionalidade em seu modelo. Confira 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
Então, em seu controlador:
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
Pode ser útil para incluir o seguinte método de extensão para a classe String
de Ruby (graças a Sikelianos ), talvez em um arquivo em seu diretório lib Rails do aplicativo:
class String
def numeric?
Float self rescue false
end
end
Em seguida, você pode executar uma verificação antes da definição 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