tjinjin's blog

インフラ要素多めの個人メモ

Railstutorial学習記録10

終わりが見えてきた9章です。

やったこと

  • ユーザの更新/表示/削除処理

メモ

  • editビューはnewビューと似ているので、パーシャルでまとめたい。 一部違うところは、変数を渡す感じなのかな。

Rails4 - render partialで部分テンプレートに変数を渡す方法 - Qiita

WebブラウザはネイティブではPATCHリクエスト (表7.1でRESTの慣習として要求されている) を送信できないので、RailsはPOSTリクエストと隠しinputフィールドを利用してPATCHリクエストを「偽造」しています

postとpatchの判断はActiveRecordのnew_record?で判断。ユーザが存在しなければtrue、ユーザがすでに存在すればfalseを返す。

  • capybaraを利用しない場合用にテスト用のutilityヘルパーを用意しておく。

  • 認証はユーザを識別、認可はそのユーザができることを定義

  • 今の実装だとログインさえしていれば、他のユーザのプロフィールを弄ることが可能((((;゚Д゚))))
  • ユーザ情報のアップデートの場合のテストは、何かページを表示させたいとかではないので、HTTPレスポンスでテストする
describe "submitting to the update action" do
  before { patch user_path(user) }
  specify { expect(response).to redirect_to(signin_path) }
end
  • フレンドリーフォワーディング。ログオンした後には、ログオンする前に表示したかったページに遷移させてあげる。

  • よくわからんところではまった。Usersページにアクセスするとエラー

ActionView::Template::Error (wrong number of arguments (2 for 1)):

Rubyのエラーメッセージwrong number of arguments (a for b)の意味 - Qiita

を参考に見ると、引数の数がおかしいらしい。gravatar_forを定義しているヘルパーを見ると

module UsersHelper

  # 与えられたユーザのGravatarを返す
  def gravatar_for(user)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end

引数1つだけじゃん!ということで引数を取るように修正

module UsersHelper

  # 与えられたユーザのGravatarを返す
  def gravatar_for(user, options = { size: 50})
    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
end

どこがで修正漏れがあったのでしょうか・・・

  • テストデータ作成にfakerを利用する。実際にありそうなユーザー名とメールアドレスを持つサンプルユーザーを自動的に作成してくれる。

  • ページネーションはwill_paginateでやると簡単らしい。

  • test用のデータ作成はFactory girlのsequenceを使ってインクリメントしたデータを使う。

  • パーシャルのリファクタリング

    Railsは@usersをUserオブジェクトのリストであると推測します。さらに、ユーザーのコレクションを与えて呼び出すと、Railsは自動的にユーザーのコレクションを列挙し、それぞれのユーザーを_user.html.erbパーシャルで出力します

とのこと。

  • ユーザの削除をできる管理ユーザの追加

  • Strong Parameterを使って、ユーザのアクセスを制限する。

感想

今更ながらRails tutorialはしたがってやっていくとcommitの単位が大きすぎると思いました。あとで見返せるようにもっとcommitを分けておけばよかったと思いました!でも、Rails tutorialの目次ある程度目処はつくので、大丈夫かなとも思っている次第です。