【rails】フォローするボタンを作る

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

viewにフォローボタンを実装する

前回、フォローボタンを設置するためのアカウントページを作成

今回はいよいよ、アカウントページにフォローボタンを実装する


followするためのパスを作る

routes.rbを開く

「account/follow」のurlパスを作る(入れ子構造)

  resources :accounts, only: [:show] do
    resources :follows, only: [:create]
  end

↓ followするための「post」リクエストがうまれる


viewにリンクを貼る

_profile.html.hamlにpostリクエストを貼る

= link_to 'Follow', account_follows_path(user), data: { method: 'post'}

このままだとフォローできない(エラー)

undefined method `id’ for “1”:String」のエラーが起きる

これは、「1」という文字列に「id」のメソッドはないよという意味

# 裏ではこういう事態が起きている

>> "1".id
!! #<NoMethodError: undefined method `id' for "1":String>
>> user
=> "1"

user.idのuserとは、Userクラスのインスタンスを想定しているが、それが認識されていない

# app/models/user.rb

  def follow!(user)
    following_relationships.create!(following_id: user.id)
  end

FollowsControllerでも「(params[:account_id])」しか渡していない


userを分岐させる

「user」の分岐
  • Userクラスのインスタンスである場合
  • そうじゃない場合


models/user.rbを開く

  def follow!(user)
    if user.is_a?(User)
      user_id = user.id
    else
      user_id = user
    end
    following_relationships.create!(following_id: user_id)
  end
  • user.idがわたってきた場合 → 「user_id」に入れる
  • userにuser.idが入って渡されてきた場合 → 「user_id」に入れる

※今回エラーがおきたのは後者のケースだったため(user => “1”)

どちらのケースであっても、user_idに適切な値が渡されるようにしておく


インスタンスであるか判定する

if ●●.is_a?(◯◯)

「●●が◯◯クラスのインスタンスであるかどうか」判定してくれるrailsのメソッド

これでエラーなくフォローができるようになった!

#DAY3