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!

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top