2009-08-25 1 views
2

Ruby on Rails를 처음 사용하고 스캐 폴딩을 사용하고 있습니다. 양식 중 하나에서 나는 두 개의 필드를 가질 수 있고 두 개의 차이점을 데이터베이스에 제출할 수 있기를 원합니다.폼에서 두 필드의 차이를 계산하는 방법 Ruby on Rails를 제출하는 방법

대신 : pickupamount, (종료 금액 - 시작 금액)을 계산하여 내 데이터베이스의 pickupamount 열에 입력하고 싶습니다.

미리 감사드립니다. 보기에

답변

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 
+0

질문에 끝나는 금액 - 시작 금액, 그리고 그 반대를 보여줍니다. –

+0

감사합니다. Sarah에게 감사합니다. –

2

. Skinny Controller Fat Model을 따라 가면 모델에 기능을 추가하는 것이 좋습니다. 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 

그런 다음 컨트롤러 :

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 

아마도 당신의 레일 응용 프로그램의 lib 디렉토리에있는 파일, 루비의 String 클래스 (sikelianos 덕분에)에 다음과 같은 확장 메서드를 포함하는 유용 할 수 있습니다 :

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

감사합니다. Sarah가이 문제에 대한 답을 찾기 위해 우연히 만났습니다. ActiveRecord 콜백은 내 문제를 해결하는 데 필요한 것입니다. – brad

관련 문제