2016年07月29日

ファクトリでIPアドレスを扱う

アプリでIPアドレスを扱う場合、各値が255以下であるなどとvalidationをかけると思いますが
ファクトリ定義でイケてる書き方を教えていただいたのでメモ。

ファクトリでIPアドレスを生成する

ファクトリでIPを生成する際

FactoryGirl.define do
  factory :device do
    sequence(:name){ |n| "device#{n}" }
    sequence(:ip_address){ |n| "127.0.0.#{n}" }
    sequence(:note){ |n| "メモ#{n}" }
  end
end

みたいに書くとspecの構造によっては255を超えてしまい、validationが通らずspecが落ちてしまいます。

そこで

sequence(:ip_address){|n| "127.0.0.#{n}"}

sequence(:ip_address) { |n| IPAddr.new(n, Socket::AF_INET).to_s }

と書くと

pry(main)> IPAddr.new(1, Socket::AF_INET).to_s
=> "0.0.0.1"
pry(main)> IPAddr.new(256, Socket::AF_INET).to_s
=> "0.0.1.0"
pry(main)> IPAddr.new(257, Socket::AF_INET).to_s
=> "0.0.1.1"

とい〜い感じに処理してくれるようになります。
rails cでお試しあれ。

おまけ

こんなGistもありました