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の目次ある程度目処はつくので、大丈夫かなとも思っている次第です。