質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.88%

Rails deviseを用いたフォロー機能実装時におけるエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 67

punchan36

score 15

前提・実現したいこと

Ruby on Railsでユーザー同士のフォロー機能を作っています。
こちらのサイト等を参照しました。
Ruby on Rails ~フォロー(友達申請)機能の実装(コードメモ)

しかし以下のエラーメッセージが発生し、試行錯誤するも先へ進めない状況です。

お見苦しい点がございましたら申し訳ありません。
お知恵を拝借頂けると幸いです。

エラーメッセージ

ActiveRecord::StatementInvalid in Users#show

Showing C:/Users/NEC-PCuser/Dropbox/app/lang_land/app/views/users/_stats.html.erb where line #5 raised:

SQLite3::SQLException: no such column: relationships.following_id: SELECT COUNT(*) FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."following_id" WHERE "relationships"."follower_id" = ?

  <a href="<%= following_user_path(@user) %>">
    <strong id="following" class="stat">
      **<%= @user.followings.count %>**
    </strong>
    フォロー
  </a>

該当のコード(_stats.html.erb)

<% @user ||= current_user %>
<div class="stats">
  <a href="<%= following_user_path(@user) %>">
    <strong id="following" class="stat">
    **<%= @user.followings.count %>**
    </strong>
    フォロー
  </a>
  &nbsp;
  <a href="<%= followers_user_path(@user) %>">
    <strong id="followers" class="stat">
      <%= @user.followers.count %>
    </strong>
    フォロワー
  </a>
</div>

該当のコード(show.html.erb)

<div class="main user-show">
  <div class="container">
    <div class="user">
      <img src="<%= "/user_images/#{@user.image_name}" %>">
      <h2><%= @user.name %></h2>
      <p><%= @user.email %></p>
      <% if @user.id == @current_user.id %>
        <%= link_to("編集", "/users/#{@user.id}/edit") %>
      <% end %>
    </div>
    <ul class="user-tabs">
      <li class="active"><%= link_to("投稿", "/users/#{@user.id}") %></li>
      <li><%= link_to("いいね!", "/users/#{@user.id}/likes") %></li>
    </ul>
    <% @user.posts.each do |post| %>
      <div class="posts-index-item">
        <div class="post-left">
          <img src="<%= "/user_images/#{post.user.image_name}" %>">
        </div>
        <div class="post-right">
          <div class="post-user-name">
            <%= link_to(post.user.name, "/users/#{post.user.id}") %>
          </div>
          <%= link_to(post.title, "/posts/#{post.id}") %>
        </div>
      </div>
    <% end %>
    <span id="user_<%= @user.id %>" class="follow-wrapper">
      <%= render 'follow_form', user: @user if signed_in? %>
    </span>
    <h4>
      <%= render 'users/stats' %>
    </h4>    
  </div>
</div>

該当のコード(user.rb)

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_secure_password

  validates :name, {presence: true}
  validates :email, {presence: true, uniqueness: true}

  def posts
    return Post.where(user_id: self.id)
  end

  has_many :following_relationships, foreign_key: "follower_id", class_name: "Relationship", dependent: :destroy
  has_many :followings, through: :following_relationships

  has_many :follower_relationships, foreign_key: "following_id", class_name: "Relationship", dependent: :destroy
  has_many :followers, through: :follower_relationships

  def following?(other_user)
    following_relationships.find_by(following_id: other_user.id)
  end

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

  def unfollow!(other_user)
    following_relationships.find_by(following_id: other_user.id).destroy
  end
end

該当のコード(relationship.rb)

class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :following, class_name: "User"
  validates :follower_id, presence: true
  validates :following_id, presence: true  
end

該当のコード(migration create_relationships)

class CreateRelationships < ActiveRecord::Migration[5.2]
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id

      t.timestamps
    end
    add_index :relationships, :follower_id
    add_index :relationships, :followed_id
    add_index :relationships, [:follower_id, :followed_id], unique: true    
  end
end

試したこと

deviseのインストールを、こちらを参考に4番の「rails g devise:install」まで行いました。
gem deviseをインストールする手順と理由

補足情報(FW/ツールのバージョンなど)

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • winterboum

    2020/01/15 18:16

    class User、Relationship,Following の関連定義の部分をを載せてください。
    belongs_to, has_many などのところです
    及び、それらのmigrationも

    キャンセル

  • punchan36

    2020/01/15 18:41

    class User、class Relationship、及びmigration(create_relationships)を追加致しました。宜しくお願い致します。

    キャンセル

回答 1

checkベストアンサー

+1

following_id であったり、followed_id であったり揺らいでますね。
統一しましょう
belongs_to :following, も合わせてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/15 21:37

    初歩的な部分を見落としておりました。
    ご回答有難うございました!エラーもなく無事に表示されました。

    ただ今度はフォローボタンが表示されない問題が出てきました。
    もう少し自分で考えてみて、もし難しい様なら再度質問させて頂きます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.88%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる