2011-04-05 2 views
1

현재 우리는 사용자의 시간 입력으로 작업하고 있습니다.루비 온 레일즈 (Ruby on Rails) 시간의 문자열 입력을 가져 와서 정수로 저장

우리는 사용자에게 가장 자연스러운 문자열로 입력을 받아들입니다. ex. 12:30, 1:30.

시간은 특정 날짜를 기준으로하는 것이 아니라 하루 중 시간대를 기준으로합니다.

그러나 우리 모델에서는 실제 시간을 정수 (자정 이후 초)로 저장하려고합니다. 어떤 제약 검사를하기 위해 정수로 필요하고 무엇이 필요하지 않은가? 또한

Time.at().utc.strftime("%I:%M%p") 

우리가로 실행하는 문제 자정 이후 초를 변환하기 전에 우리가 정규식 사용자가 문자열 입력을 유효성을 검사 할 것입니다 함께 멋진 캐릭터를 다시 한 후 출력에 우리에게 쉬울 것이다 그것을 저장합니다. 그러나 우리 모델 validates_by_format 전에 필드가 이미 일종의 정수 유형으로 변환 된 것 같습니다. 우리가 변환하고 정수로 (자정 이후 초) 저장하기 전에 정규 표현식을 사용하여 사용자 입력을 검사하는 방법에 대한 아이디어가 있습니까?

는 여기에 우리의 코드 snipits의 일부입니다 :

모델은 우리 테이블

start_time :integer 
end_time :integer 

def create 
    @course_offering = current_term.course_offerings.new(params[:course_offering]) 

    if @course_offering.save 
     #flash[:success] = "Offering created" 
     @conflicts = conflicts(@course_offering) 
     render :show 
    else 
     render :new 
    end 
    end 

새로운 컨트롤러 기능에

validates_format_of :start_time, :with => /\A(1[0-2]|[1-9]):[0-5][0-9]\z/, :message => "Must be valid time format" 

필드를 확인

vi EW

<% form_for @course_offering do |f| %> 
<!-- other fields above this --> 
<p> 
    <%= f.label :start_time %><br> 
    <%= f.text_field :start_time %> 
</p> 
<p> 
    <%= f.label :end_time %><br> 
    <%= f.text_field :end_time %> 
</p> 
<% end %> 
+1

new.html.erb 또는 동급 제품을 게시하십시오. –

답변

1

. start_time 및 end_time은 정수로 유지했지만 모델에서 가상 속성을 사용하여 모델에서 문자열 입력을 가져 왔습니다.

# our new fields 
<p> 
    <%= f.label :start_time_string %><br> 
    <%= f.text_field :start_time_string %> 
</p> 

# model 
def start_time_string 
    Time.at(start_time + 5*3600).strftime("%l:%M %p") if !start_time.nil? 
end 

def start_time_string=(start_time_str) 
    self.start_time = Time.parse(start_time_str).seconds_since_midnight 
end 

그런 식으로 우리의 사용자 수 '12 같이 입력 시간 : 30 PM ',하지만 자정 후 좋은 시간으로 저장 한 것입니다.

1

나는 모델에서 유효한 시간에 사용자 입력을 구문 분석 할 수있는 경우 검사 지정 유효성 검사 방법,이 같은 것을 사용합니다 : 우리는 결국 우리의 딜레마를 해결

validate :user_must_enter_valid_time 

def user_must_enter_valid_time 
    errors.add(:start_time, "Incorrect format of start time") if 
     !valid_time?(start_time) 
end 

def valid_time?(time_string) 
    begin 
    parsed_input = Time.parse(time_string) 
    #Checking if user entered time no earlier than 24 hours before current time 
    return Time.now - parsed_input < 24 * 60 * 60 
    rescue Exception => e 
    return false 
    end 
end 
+0

나는 이것이 무엇을하고 있는지에 대해 긍정적이지는 않지만, 이것이 우리가 위에서 쓴 유효성을 사용할 수 없다는 우리의 문제를 우회하는 것을 보지 못한다. 문제는 뷰에서 문자열로 입력을 가져 오는 것입니다. 문자열이 우리 정규식의 유효한 입력인지 확인한 다음 정수로 변환 (자정 이후 초)하고 start_time에 정수 값으로 저장합니다. – febs

+0

@febs - 첫 번째 메서드는 valid_time? (start_time) 메서드가 false를 반환하면 응용 프로그램에 오류를 추가하도록 지시하는 새로운 유효성 검사 메서드입니다. 두 번째 메소드는 valid_time? (time_string)을 정의합니다. 다음 두 경우에 false를 반환합니다. a) time_string 문자열을 Time으로 변환 할 수 없으며 예외를 반환합니다. 사용자가 "abcd"를 입력했습니다. b) time_string은 Time.now에서 24 시간 이전의 시간으로 파싱됩니다. 왜냐하면이 항목도 유효성을 검사해야한다는 것을 이해했기 때문입니다. 코드를 편집하여 더 멋지게 만들었습니다. 정규 표현식은 훌륭하지만 이해하기가 더 어렵고 사용자가 필요한 것보다 더 일찍 입력했는지 확인하지 않습니다. –

+0

이 방법이 마음에 들지만 문제는 start_time 필드에서 유효성 검사 모델로 실제 값을 전달하는 것입니다. 또한 우리는 시간이 자정 이전인지 여부를 확인하려고하지 않습니다. 이것은 단순히 시간을 저장하는 방식입니다. 우리는 임의의 시간 (날짜 없음)으로 작업하므로 좋은 생각 인 것 같습니다. 사용자 지정 유효성 검사를 한 번 제공했지만 사용자가 (12:30 또는 1:53) 값을 입력하면 시간 값에서 값이 잘려서 DB와 정수의 데이터 형식과 관련이 있다고 생각합니다. 문자열 입력. – febs

관련 문제