2

Ruby on Rails は初めてで、Scaffolding を使用しています。フォームの 1 つで、2 つのフィールドを使用できるようにしてから、2 つのフィールドの違いをデータベースに送信したいと考えています。

:pickupamount の代わりに、(終了金額 - 開始金額) を計算して、データベースの pickupamount 列に入力します。

前もって感謝します!

4

2 に答える 2

2

これは、モデルまたはコントローラーで行うことができます。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

次の拡張メソッドを Ruby のクラスに含めると ( sikelianosStringのおかげで)、おそらく Rails アプリの lib ディレクトリ内のファイルに含めると便利な場合があります。

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
于 2009-08-25T19:38:00.990 に答える
0

あなたの見解では:

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
于 2009-08-25T19:23:42.203 に答える