2013-03-05 3 views
2

내가 달성하고자하는 것은 문자열을 가져 와서 숫자가되도록 구문 분석하는 것입니다. 그러면 그것을 표시 할 때 number_to_phone을 사용할 것이고 그들은 모두 같을 것입니다.전화 번호 형식을위한 코드 단순화

def parse_phone_nums 
    self.main_phone = self.main_phone.gsub(/[.\-()\W]/, '') if self.main_phone 
    self.alt_phone = self.alt_phone.gsub(/[.\-()\W]/, '') if self.alt_phone 
    self.main_phone = "925" + self.main_phone if self.main_phone.length == 7 
    self.alt_phone = "925" + self.alt_phone if self.alt_phone.length == 7 
    end 

을 그리고 만들고 수정 작업에 내 컨트롤러에 전화 :

지금까지 나는이 내 모델에 정의합니다. 마치 여기에 많은 반복이있는 것처럼 느껴지며 가능한 코드가 얼마나 DRY가 될지 궁금해합니다. 많은 약의

+1

을 나는 코드가 오류없이 실행 믿지 않는다. – oldergod

+0

반복되는 코드가 무엇인지 (그리고 잘하면 논리 오류), 당신은 그 복제를 제거하기위한 * 어떤 방법도 생각해 낼 수 없을 것이라고 확신합니까?! 아마도 일종의 방법일까요? –

+0

@oldergod 맞아요, 비교에서 double equals을 잊어 버렸습니다. - 게다가, 다른 방법으로 옮길 수는 있었지만 비트를 줄 였지만 괜찮은 것 같습니다. – cadlac

답변

2

한 가지 가능한 솔루션 : 등등 콜백 동안 설정에 자동으로 포함하여이 방법을 사용 할 수있는 방법의 수, 그리고이 있습니다

def clean_up_phone(num) 
    return unless num 
    num = num.gsub(/[.\-()\W]/, '') 
    num.length == 7 ? "925#{num}" : num 
end 

.

저는 정규식이 정말로 원하는 것인지 확신하지 못합니다. 사람들은 전화 번호로 꽤 많은 것들을 입력합니다. 유효성 검사 전에 좀 더 처리하고 그 후에 지역 코드를 추가 할 수 있습니다.

0

향후 확장 (다른 지역 코드? 사용자가 제출 한 지역 코드를 감지하는 등)이 가능하고 쉽게 테스트 할 수 있기 때문에 이런 식으로 갈 것입니다.

그리고 사용자가 사용할 수있는 문자에 대한 정규 표현식을 잊어 버리기 쉽기 때문에 주어진 문자열에서 숫자를 추출하는 데 다른 방법을 사용합니다.

def parse_phone_nums 
    self.main_phone = parse_phone_number(self.main_phone) if self.main_phone 
    self.alt_phone = parse_phone_number(self.alt_phone) if self.alt_phone 
end 

private 

def parse_phone_number(string) 
    number = extract_number(string) 
    prefix_area_code(number) 
end 

def extract_number(string) 
    characters = string.split("") 
    characters.reduce("") { |memo, char| "#{memo}#{char}" if numeric?(char) } 
end 

def prefix_area_code(number) 
    prefix = number.length == 7 ? "925" : "" 
    "#{prefix}#{number}" 
end 

def numeric?(string) 
    Float(string) != nil rescue false 
end 

이상적으로는 자신의 클래스에 모든 private 방법을 추출하는 것,의는 PhoneNumberParser을 가정 해 봅시다.

당신이 def_phone_nums 충분히 건조하지 않거나 당신이 더 많은 전화 번호가있는 경우,이 작업을해야한다고 생각하는 경우 :

def parse_phone_nums 
    phones = %w[main alt] 
    phones.each do |phone| 
    current = self.send("#{phone}_phone") 
    next unless current 

    parsed = parse_phone_number(current) 
    self.send("#{phone}_phone=", parsed) 
    end 
end