初めに
今回RSpecのシステムスペックにてフォーム入力を簡略化するためにフォーム入力用のメソッド(fill_sign_up_form)を作成した。 しかし、このままだと柔軟に値を変更できないのでキーワード引数を利用して値を柔軟に返ることができるようにしてみた。
問題
改善前のコード
def fill_sign_up_form(user) fill_in 'メールアドレス', with: user.email fill_in '電話番号', with: user.phone_number select user.birthdate.year.to_s, from: 'user_birthdate_1i' end fill_sign_up_form(user, birthdate: Date.today + 1.day) # 値の更新ができない
- このままではデフォルトの値から変更を加えたい場合には値の代入ができず、決まった値しか入力フォームに入力できない。
改善後のコード(キーワード引数を使用してデフォルトの値を柔軟に変更することができる)
def fill_sign_up_form(user, email: user.email, phone_number: user.phone_number, birthdate: user.birthdate) fill_in 'メールアドレス', with: email fill_in '電話番号', with: phone_number select birthdate.year.to_s, from: 'user_birthdate_1i' select birthdate.month.to_s, from: 'user_birthdate_2i' select birthdate.day.to_s, from: 'user_birthdate_3i' end fill_sign_up_form(user, birthdate: Date.today + 1.day) # ←こでオーバライドが効く!
なぜオーバーライドができるようになったのか?
- Rubyのキーワード引数にはメソッドを呼び出す際に更新したい一部のみ明示的にキーと値を指定することで値の更新を行うことができる特徴がある。
def greet(user, name: user.name) puts "Hello, #{name}" end
これでgreet(user, name: 'Bob')のようにしてuser.nameを上書きして更新することができる。
第一引数にuserを渡していますが、これはuserのデフォルト値を設定するためにuserを第一引数に当てています。