今回はプロゲートの上級4章、「いいね!機能を作ろう」をやっていきます。
いいね!機能のテーブルを作ろう
いいね!機能はどのユーザーがどの記事にいいねをしているかという情報を保持することで実現 user_id,note_idを保持するlikesテーブルを作成する
$ rails g model Like user_id:integer note_id:integer $ rake db:migrate
多対多の関係
ユーザーはいいねを複数の記事にできる。 記事はいいねを複数ユーザーからもらえる。 よって、いいね(Like)はユーザー(User)と記事(Note)に複数保持される関係となっている。
このような関係を多対多の関係と呼ぶ。 この関係を実装で表現する。
class User < ActiveRecord::Base has_many :likes ・ ・ end
note.rb
class Note < ActiveRecord::Base has_many :likes ・ ・ end
所属するモデルは単数形で表現。 belongsのsは三単現のsかなぁ?? できるだけ意味を理解して記憶に定着させていきたいですね。
like.rb
class Like < ActiveRecord::Base belongs_to :user belongs_to :note ・ ・ end
likesコントローラをつくろう
コントローラーを作成する
like(いいね)とunlike(いいね解除)アクションを定義するため、自動生成(scaffold)を行わない。
$ rails g controller likes
アクションが自動生成されないため、対応するviewファイルも生成されない。
アクション定義、ルーティング設定、viewへいいねリンクを追記と作業を行っていく。
アクション定義
ひとまず、中身なしのメソッドを作成する。後で実装する。
class LikesController < ApplicationController def like end def unlike end end
ルーティングを設定する
直接URLを入力していいねをできないようにlikeアクションのHttp Verb(動詞)にはpostを指定
Rails.application.routes.draw do post 'like/:note_id' => 'likes#like', as: 'like' delete 'unlike/:note_id' => 'likes#unlink', as: 'unlink' ・ ・ end
いいね!リンクを作ろう
link_toヘルパーはデフォルトVerb getになるがpost指定することでpostで送信できる
<%= link_to 'いいね!', like_path(@note.id), method: :post %>