Rails勉強してますこの広告は、90日以上更新していないブログに表示しています。Relationshipモデルユーザーをフォローする機能を実装するために、Relationshipデータモデルを作成する。followed_id:integerrelationshipsテーブルにインデックスを追加し、データベースのマイグレーションを行う。"User"endRelationshipのバリデーション今の時点では生成されたRelationship用のfixtureファイルは空にしておく。trueendフォローしているユーザーUserモデルにfollowingの関連付けを追加する。.endfollowingで取得した集合をより簡単に取り扱うために、followやunfollowといったメソッドを追加する。追加するメソッドはまずテストから先に書いていく。endendこの時点でテストは失敗するので、次にfollowing関連のメソッドを追加する。.end再びテストをして成功。検証することができる。ないので、手動でpicture_sizeという独自のバリデーションを定義する。独自のバリデーションを定義するためには今まで使っていたvalidatesメソッドではなく、validateメソッドを使う。endend上記で定義した画像のバリデーションをビューに組み込むために、クライアント側に2つの処理を追加する。});</script>画像のリサイズ画像をリサイズするためには、画像を操作するプログラムが必要になる。ImageMagickというプログラムを開発環境にインストールする。ImageMagick次に、MiniMagickというImageMagickとRubyを繋ぐgemを使って、画像をリサイズする。:fileという行によって、ローカルのファイルシステムに画像を保存するようになっているが、本番環境ではファイルシステムではなくクラウドストレージサービスに画像を保存するようにする。gemを使うと簡単できる。投稿した画像を扱ったり、その画像をMicropostモデルと関連付けするために、CarrierWaveという画像アップローダーを使う。gemをGemfileに追加する。installCarrierWaveを導入すると、Railsのジェネレーターで画像アップローダーが生成できるようになる。Picture関連付けされる属性には画像のファイル名が格納されるため、String型にしてpicture属性をMicropostモデルに追加する。db:migrateCarrierWaveに画像と関連付けたモデルを伝えるためには、mount_uploaderというメソッドを使い、引数に属性名のシンボルと生成されたアップローダーのクラス名を取る。これをMicropostモデルに追加する。}endHomeページにアップローダーを追加するために、マイクロポストのフォームにfile_fieldタグを追加。%>micropost_paramsメソッドにpicture属性を追加する。endendMicropostパーシャルのimage_tagヘルパーでアップロードされた画像を描画する。マイクロポストを操作するマイクロポストリソースのルーティングを設定する。micropost_path(micropost)関連付けられたユーザーを通してマイクロポストにアクセスするので、createアクションやdestroyアクションを利用するユーザーは、ログイン済みでなければならない。正しいリクエストを各アクションに向けて発行し、マイクロポストの数が変化していないかどうか、また、リダイレクトされるかどうかをテストする。endendテストは失敗。コードが重複しないよう、このときUsersコントローラからもlogged_in_userを削除しておく。endendMicropostsコントローラの各アクションでlogged_in_userメソッドを使えるようにする。endend再びテストし成功。マイクロポストを作成する.マイクロポストのcreateアクションを作っていく。endendマイクロポスト作成フォームを構築するために、if-else文の分岐を使ってサイト訪問者がログインしているかどうかに応じてコードを書き分ける。%>パーシャルを作る。%>フォームが動くようにするために@micropostを定義する.。endendエラーメッセージのパーシャルを再定義する。Userオブジェクト以外でも動作するようにerror_messagesパーシャルを更新する。%>このパーシャルは他の場所でも使われているので、それぞれのビューでも使えるように更新する。これでマイクロポスト作成フォームが表示できる。Homeページに投稿したマイクロポストを表示する部分を実装する。Userモデルにfeedメソッドを作る。.endサンプルアプリケーションでフィードを使うために、現在のユーザーのページ分割されたフィードに@feed_itemsインスタンス変数を追加して、フィード用のパーシャルをHomeページに追加する。%>パーシャルで、renderに@feed_itemsを渡しているのは、Railsが対応する名前のパーシャルを、渡されたリソースのディレクトリ内から探しにいくことができるため。Homeページにステータスフィードを追加する。</div></div>マイクロポストを削除する自分が投稿したマイクロポストに対してのみ削除リンクが動作するように機能を追加する。最初にマイクロポストのパーシャルに削除リンクを追加。</span></li>次に、Micropostsコントローラのdestroyアクションを定義する。endendフィード画面のマイクロポストをテストするまずはマイクロポスト用のfixtureに、別々のユーザーに紐付けられたマイクロポストを追加していく。lana次に、自分以外のユーザーのマイクロポストは削除をしようとすると、適切にリダイレクトされることをテストする。endend最後に統合テストを書くためにファイルを生成。リンクが表示されないことを確認、といった順でテストしていく。datetimeマイクロポストの投稿にString型ではなくText型を使っている理由は、Text型の方が投稿フォームを表現豊かにしたり、変更に柔軟に対応できるため。Micropostモデルを生成。user:referencesreferences型を利用することで、自動的にインデックスと外部キー参照付きのuser_idカラムが追加され、UserとMicropostを関連付けする下準備をしてくれる。生成されたマイグレーションファイルでuser_idとcreated_atカラムにインデックスを付与する。することで、user_idに関連付けられたすべてのマイクロポストを作成時刻の逆順で取り出しやすくなる。endendマイグレーションを使って、データベースを更新。db:migrateMicropostモデルのバリデーションに対するテストを追加。endendこの時点ではテストは失敗するのでMicropostモデルのバリデーションを追加する。}endこれでテストに成功しました。UserモデルとMicropostモデルを関連付ける。関連付けにはbelongs_to/has_manyを使う。:userというコードが必要になるが、マイグレーションによって自動生成されている。:micropostsと追加する必要があるので追加していく。scopeというテクニックを使う。マイクロポストの順序付けのテストを先に作っていく。endendテストは失敗。テストではマイクロポスト用のfixtureファイルからサンプルデータを読み出しているので、fixtureファイルを用意する。%>default_scopeを使いマイクロポストを投稿の古い順番に並べる。}end再びテストし成功。:destroyというオプションを使うと、ユーザーが削除されたときに、そのユーザーに関連づいたマイクロポストも一緒に削除されるようになる。.end正しく動くかどうか、テストする。そのユーザーのマイクロポストや投稿した総数を表示させる。Micropostのコントローラとビューを作成。マイクロポストを追加する。</div></div>@microposts変数をwill_paginateに渡す必要があるので、showアクションに追加する。.endサンプルデータにマイクロポストを追加し、開発環境用のデータベースで再度サンプルデータを生成する。db:seedマイクロポスト用のCSSを追加する。}}プロフィール画面で表示されるマイクロポストに対して、テストを書いていく。users_profileテストのためにfixtureファイルを更新。パスワードを再設定するPasswordResetsコントローラのeditアクションの実装をする。パスワード再設定の送信メールには、パスワード再設定フォームを表示するためのリンクが含まれているので、まずはそのためのビューを設定する。</div></div>editアクションとupdateアクションのどちらの場合も正当な@userが存在する必要があるので、いくつかのbeforeフィルタを使って@userの検索とバリデーションを行う。endendパスワードを更新するためには、フォームからの送信に対応するupdateアクションが必要になる。updateアクションでは、下記の4つのケースを考慮する必要がある。新しいパスワードが正しければ、更新する1のために、editとupdateアクションに期限切れかどうかを確認するメソッドとbeforeフィルターを用意することで対応する。endendpassword_reset_expired?メソッドをUserモデルに追加する。.endパスワード再設定のテストをするためにファイルを生成してテストを追加する。(再掲)production環境とSendGridの設定は11章でやっているため省略。Gitのトピックブランチをmasterにマージ。password-resetリモートリポジトリにプッシュし、Herokuにデプロイする。db:migrateHeroku上でも動作を確認。PasswordResetsリソーストピックブランチを作成。password-resetパスワード再設定用のコントローラを作る。その際、newアクションとeditアクションも一緒に生成する。--no-test-frameworkルーティングを設定。password_resets_url(token)パスワード再設定画面へのリンクを追加する。</div></div>reset_digest属性とreset_sent_at属性をUserモデルに追加する。下記を実行して、マイグレーションに属性を追加。db:migrate新しいパスワード再設定画面ビューを作成する。</div></div>フォームから送信後、メールアドレスをキーとしてユーザーをデータベースから見つけ、パスワード再設定用トークンと送信時のタイムスタンプでデータベースの属性を更新する必要がある。続いてルートURLにリダイレクトし、フラッシュメッセージをユーザーに表示する。送信が無効の場合は、ログインと同様にnewページを出力してflash.nowメッセージを表示する。endendUserモデルにパスワード再設定用メソッドを追加。パスワード再設定のメール送信Userメイラーのpassword_resetメソッドを変更し、テキストメールのテンプレートとHTMLメールのテンプレートもそれぞれ変更する。is.</p>Railsのメールプレビュー機能でパスワード再設定のメールをプレビューするためにコードを追加する。endendパスワード再設定用メイラーメソッドのテストを追加する。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。