29

検索しましたが、これは単純なはずですが、機能させることができません。電話番号を保存する前に、数字以外の文字をすべて削除しようとしています。これは私が現在持っているものです:

before_save { |workorder| workorder.phonenumber = 
                  phonenumber.to_s.gsub(/\D/, '').to_i }

したがって、ユーザーが入力した場合

925-555-5555

9255555555を節約するはずですが、実際には925しか節約できず、その後はすべて無視されます。

私も試しました:

before_save { |workorder| workorder.phonenumber = 
                  phonenumber.to_s.gsub(/[^0-9]/, "").to_i }

同じ結果になります。

解決済み:

def raw_phonenumber
  self.phonenumber
end
def raw_phonenumber=(s)
  self.phonenumber=s.gsub(/\D/, '')
end
4

3 に答える 3

62

あなたは確かにphonenumber列を数として定義しました。そのため'925-555-5555'phonenumber属性を設定すると、数値にキャストされ、925保持されるだけです。

最善の解決策は、データベースの列のタイプをに変更することstringです。新しい移行を作成します。

change_column :table_name, :phonenumber, :string, limit: 30

それ以外の場合は、このようにセッターをオーバーライドして、数字以外の文字を削除できます(ただし、「0」で始まる電話番号は修正されません)。

def phonenumber=(phonenumber)
  write_attribute(:phonenumber, phonenumber.gsub(/\D/, ''))
end

このブログ投稿の他の選択肢

于 2012-09-28T18:23:01.510 に答える
4

これを行う最も簡単な方法は、field=メソッドを変更することです。

def field=(value)
  super(value.delete('^0-9'))
end
于 2018-09-10T00:17:36.880 に答える
0

次のように、携帯電話番号を保存/表示するためのカスタムメソッドを作成できます。

def mobile_number(arg)

if arg.downcase.include?('special chars')

phone_number = arg.downcase.split('special chars')

phone = if phone_number[0].to_i == 0 || phone_number[0].to_i.to_s.size < 10
number_to_phone(phone_number[0].gsub!(/[^0-9A-Za-z]/, '').to_i, area_code: true)
else
number_to_phone(phone_number[0].to_i, area_code: true)
end

return phone.to_s + ' Ext'+ remove_unnecessary_keywords(phone_number[1])

elsif arg.include?('(') || arg.include?(')') || arg.include?('-') || 
arg.include?('.') || arg.include?(' ')

return  number_to_phone(arg.gsub!(/[^0-9A-Za-z]/, '').to_i, area_code: true)    

else

return number_to_phone(arg.to_i, area_code: true) 

end

end  
于 2018-05-25T10:21:38.330 に答える