読者です 読者をやめる 読者になる 読者になる

気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Rails プロゲートの上級4章(いいね!機能を作ろう)

Rails

今回はプロゲートの上級4章、「いいね!機能を作ろう」をやっていきます。

いいね!機能のテーブルを作ろう

いいね!機能はどのユーザーがどの記事にいいねをしているかという情報を保持することで実現 user_id,note_idを保持するlikesテーブルを作成する

$ rails g model Like user_id:integer note_id:integer
$ rake db:migrate

多対多の関係

ユーザーはいいねを複数の記事にできる。 記事はいいねを複数ユーザーからもらえる。 よって、いいね(Like)はユーザー(User)と記事(Note)に複数保持される関係となっている。

このような関係を多対多の関係と呼ぶ。 この関係を実装で表現する。

複数保持されるlikeは複数形で指定。
user.rb

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 %>