ProgateでRuby on Railsを復習(その5)

Ruby

最後に「いいね」機能の追加、パスワードの暗号化を実装します。

投稿とユーザの紐付け

いいね機能を実現するため、まずは投稿とユーザの情報を紐付けします。

最初に rails g migrationコマンドでファイルを作成→追加カラムを記述→DB反映+バリテーションの設定までを実施します。

 

 

 

新規投稿時(posts#create)のアクションを変更し、ユーザIDを保存できるようにします。

 

投稿情報とユーザ情報を紐付けるため、Postモデルに下記関数を追加します。

つづけて、postsコントローラ側で以下のように記述することで、投稿詳細画面のビュー(show.html.erb)でも@userとして投稿に紐付くユーザ情報にアクセスできるようになります。(↓のような感じ)

 

データの紐付けができたので、投稿詳細のビュー(posts/show.html.rb)でユーザ名と画像を表示します。

投稿一覧画面でも同様にユーザ名と画像を表示します。
投稿一覧の方は@postsと複数系になっていることから分かるように配列なので、ビュー側のループの途中で user 変数をセットします。

ここまで出来たら、ユーザ詳細画面を編集し、該当ユーザの投稿一覧を表示できるようにします。

まずはusersコントローラ側で紐付く投稿一覧を取得して表示します。

つづけて、ユーザ詳細画面のビュー(users/show.html.erb)に投稿一覧を表示します。(内容自体はposts/index.html.erbと同じなのでコピペ)

自分の投稿のみ編集・削除できるようにアクセス制限をかける

今のままだと自分以外の投稿データも編集・削除できてしまうので、アクセス制限をかけます。

まずはビュー側でリンクを自分の投稿以外は非表示にします。

つづけて、直接URL指定にてアクセスされた場合も制限するため、postsコントローラに以下を追記します。

 

いいね機能の作成

まずはLikeモデルを作成します。(保持する情報は、ユーザIDとポストIDの2つ)

Likeモデルにバリデーションを設定しておきます。

つづけて、railsコマンドでlikesコントローラをマルッと作成します。

ルーティングを追加します。

アクションではpostメソッドでcreateとdestroyを作成します。

また、いいね機能はログインしていることが前提なので、likesコントローラにログインチェックをかけておきます。

投稿詳細ビュー(posts/show.html.erb)に「いいね」、「いいね取消」を追加します。

 

コントローラ側でいいね(create)といいね取消(destroy)を実装します。

ここまでで、ひとまず機能の動作が出来あがったので、ちょっと見た目を良くするため「いいね」をハートの絵文字(FontAwsome)に変更します。

allication.html.erbのheadタグで以下を読み込みます。

ビューを書き換えます。
ポイントは、link_to()でHTML自体をリンク文字列に指定する場合は、「link_to(“url”) do HTML」という形で指定する必要がある点です。
具体的には以下のようになります。

CSSで「いいね」と「いいねの取消」で文字色を変えます。

 

ユーザ詳細画面に「いいね」した投稿一覧を表示する

ユーザ詳細画面で自分が「いいね」した投稿一覧を表示できるように、ビュー(users/show.html.erb)にリンクを追加します。

ルーティングを追加します。

users#likesアクションを作成します。

 

いいね記事一覧のビュー(likes.html.erb)を作成します。

 

パスワードの暗号化

今はユーザのパスワードがデータベース上に平文で保存されているので、暗号化した状態で保管するように修正します。

まずはbcryptというモジュールを組み込むため、Gemfileに「gem ‘bcrypt’」を記述して「bundle install」コマンドを実行します。

モジュールの組み込みができたので、Userモデルに以下1行を追加し、暗号化を有効にします。

rails g migration add_password_digestを実行し、マイグレーションファイルに以下を記述します。
ここでのポイントは、password_digestカラムを追加し、既存のpasswordカラムを削除する点です。

 

ここまでで一旦コンソールから確認します。

これで、usersテーブルのpassword_digestカラムに暗号化された文字列が格納されます。利用する側からするとpasswordカラムに設定しているにも関わらず、password_digestカラムに格納されます。(なんだか不思議ですが・・・)

データベース側の準備ができたので、暗号化されたパスワードでログインできるように処理を変更します。
といってもログイン時のチェックのみです。作成と変更はコンソールで確認したように従来通りpasswordカラムを設定すれば勝手に暗号化されて格納されます。

と変更します。

has_secure_passwordメソッドを有効化することで、authenticateメソッドが使えるようになります。このメソッドにより、引数に渡した文字列が暗号化され、DBに登録されているpassword_digestと比較してくれるようになります。(仕組みがよく分からないけど・・・)

ここまででRuby on Railsコースはひと通り完了です。
これを何度か繰り返してスラスラできるようになれば、次のステップにGOですかね。。。

 

コメント