Ruby on Rails Tutorial 7章

ぼちぼち進めております。

進める中で調べたメモ。

次は7.4から…

Option引数とKeyword引数

演習で違いを調べろというのがあったのでやってみた。

Option引数

オプションとして使う引数(名前の可変長のハッシュ)。

あってもなくても動く。定義していないキーがあっても動く。

そのへん柔軟なので将来の拡張性が高いのが嬉しいところ。らしい。

Rails Tutorialのコードを使った例

ユーザのemailを元にGravatarから画像を引っ張ってきて表示するヘルパー。

gravatar_urlのクエリに、optionsという名前のオプション引数の中のsizeを含めている。

def gravatar_for(user, options = { size: 80 })
  gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
  size = options[:size]
  gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
  image_tag(gravatar_url, alt: user.name, class: "gravatar")
end

呼び出し側は以下のどのパターンでも動いた

  • あるパターン
    • <%= gravatar_for @user , size: 50 %>
    • sizeは50
  • ないパターン
    • <%= gravatar_for @user %>
    • sizeはdefaultで定義した80
  • ない(余計なものがある)パターン
    • <%= gravatar_for @user , hogehoge: 50 %>
    • sizeはdefaultで定義した80
    • うごくんやこれ。。

Keyword引数

あってもなくてもいいが、

オプション引数と違って、定義外の引数は渡せない。

ただしググった感じ、引数を渡す順番は自由みたいです。(未検証)

Options引数の場合はハッシュの中から自分で取り出す行が1行挟まってたけど

keyword引数の場合はそれをやらなくてもいい。

def gravatar_for(user, size: 80)
  gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
  gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
  image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
  • ないパターン
    • <%= gravatar_for @user %>
    • sizeはdefaultで定義した80
  • あるパターン
    • <%= gravatar_for @user , size: 50 %>
    • sizeは50
  • ✗ ない(余計なものがある)パターン
    • <%= gravatar_for @user , hogehoge: 50 %>
    • エラーになった。エラーメッセージはActionView::Template::Error (unknown keyword: hogehoge):

ブラウザによるバリデーション(Rails関係ない)

7.3.1 の段階でいい感じのバリデーションのメッセージが出てきた

f:id:pypypyo14:20190209172820p:plain

Userクラスにバリデーションは入れてるけど、

まだこの段階でチェックは走らないと思うし

こんなエラーメッセージ自分で書いてないし気持ち悪かったので正体を調べた

結論:

input type="email" のフォームはブラウザの方でバリデーションしてくれるみたい。

参考リンク: www.htmq.com

マスアサインメントとストロングパラメータ

  • マスアサインメント
    • フォームから送信されたデータをノーチェックでDB登録すること
    • 脆弱
  • Strong Parameters
    • 引き渡すパラメータを許可制にする
    • 変なパラメータを紛れ込ますことができなくなる
    • 実装例: params.require(:user).permit(:name, :email, :password, :password_confirmation)