前提・実現したいこと
ここに質問の内容を詳しく書いてください。
rials on ruby にてPF作成中で
PFでフォロー・フォロワー機能の非同期通信化を実装したいです。
拙い情報で恐縮ではございますが、ご教示のほど宜しくお願い致します。
■非同期通信機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
article一覧からarticle詳細ページへ遷移する際に以下のエラーメッセージが出ます。
エラーメッセージ
NoMethodError in Articles#show
undefined method `id' for nil:NilClass
該当のソースコード
ソースコード
user.rb
ruby
1コードclass User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 has_many :articles 8 has_many :favorites, dependent: :destroy 9 attachment :profile_image, destroy: false 10 11 validates :name, length: { minimum: 2, maximum: 20 }, uniqueness: true 12 validates :profile, length: { maximum: 200 } 13 14 has_many :followed_relationships, foreign_key: "follower_id", class_name: "Relationship", dependent: :destroy 15 has_many :followed, through: :followed_relationships 16 has_many :follower_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy 17 has_many :followers, through: :follower_relationships 18 19 #フォローしているかを確認するメソッド 20 def followed?(user) 21 followed_relationships.find_by(followed_id: user.id) 22 end 23 24 #フォローするときのメソッド 25 def follow(user) 26 followed_relationships.create!(followed_id: user.id) 27 end 28 29 #フォローを外すときのメソッド 30 def unfollow(user) 31 followed_relationships.find_by(followed_id: user.id).destroy 32 end 33 34 35end 36
users_controller.rb
ruby
1コードclass UsersController < ApplicationController 2 3 before_action :authenticate_user! 4 before_action :ensure_correct_user, only: [:edit, :update] 5 6 def show 7 @user = User.find(params[:id]) 8 @articles = @user.articles 9 # @article = Article.new 10 end 11 12 def index 13 @users = User.all 14 end 15 16 def edit 17 @user = User.find(params[:id]) 18 end 19 20 def update 21 @user = User.find(params[:id]) 22 if @user.update(user_params) 23 redirect_to user_path(@user), notice: "更新しました!" 24 else 25 render "edit" 26 end 27 end 28 29 def followed 30 #@userがフォローしているユーザー 31 @user = User.find(params[:id]) 32 @users = @user.followed 33 render template: "relationships/followed" 34 end 35 36 def followers 37 #@userをフォローしているユーザー 38 @user = User.find(params[:id]) 39 @users = @user.followers 40 render template: "relationships/follower" 41 end 42 43 private 44 45 def user_params 46 params.require(:user).permit(:name, :profile, :profile_image) 47 end 48 49 def ensure_correct_user 50 @user = User.find(params[:id]) 51 unless @user == current_user 52 redirect_to user_path(current_user) 53 end 54 end 55 56end
_info.html.erb
html
1コード<table class='table'> 2 <tr><%= attachment_image_tag user, :profile_image, :fill, 100, 100, fallback: "no-image-icon.jpg", class:"mt-3 rounded-circle"; %></tr> 3 <tr> 4 <th><%= user.name %></th> 5 </tr> 6 <tr> 7 <th><%= user.profile %></th> 8 </tr> 9 <tr> 10 <th>follows</th> 11 <th class="follower"> 12 <%= link_to followers_user_path(user.id) do %> 13 <h5 style="color: black;"><%= user.followers.count %></h5> 14 <% end %> 15 </th> 16 </tr> 17 <tr> 18 <th>followers</th> 19 <th class="follow"> 20 <%= link_to followed_user_path(user.id) do %> 21 <h5 style="color: black;"><%= user.followed.count %></h5> 22 <% end %> 23 </div> 24 </tr> 25 <tr> 26 <th> 27 <% if user_signed_in? && @user != current_user %> 28 <div id="follow_form"> 29 <% if current_user.followed?(@user) %> 30 <%= render "users/unfollow" %> 31 <% else %> 32 <%= render "users/follow" %> 33 <% end %> 34 </div> 35 <% end %> 36 </th> 37 </tr> 38</table> 39 40<div class='row'> 41 <%= link_to '',edit_user_path(user),class: "btn btn-outline-secondary btn-block fas fa-user-cog edit_user_#{user.id}" %> 42</div>
_
_index.htm.erb
html
1コード<div class="card-list-containar py-5"> 2 <% @articles.each do |article| %> 3 <div class="card w-50 mx-auto mt-4 shadow-lg"> 4 <%= link_to article_path(article.id) do %> 5 <%= attachment_image_tag article, :image, class:"card-img-top"; %> 6 <% end %> 7 <div class="card-body"> 8 <div class="row"> 9 <div class="col-2"> 10 <%= attachment_image_tag article.user, :profile_image, :fill, 60, 60, fallback: "no-image-icon.jpg", class:"mt-3 rounded-circle"; %> 11 </div> 12 <div class="col-10"> 13 <p class="card-title"> 14 <%= link_to(article_path(article.id), class:"text-dark") do %> 15 <strong><i class="far fa-flag"></i><span> <%= article.title %></span></strong> 16 <% end %> 17 </P> 18 <p class="card-text">本文:<%= article.body.truncate(30) %></p> 19 <span><i class="fas fa-user"></i> By <%=link_to article.user.name %> | </span> 20 <span><i class ="favorite_btn_<%= article.id %>"><%= render "favorites/favorite-btn", article: article %></i></span> 21 </div> 22 </div> 23 </div> 24 </div> 25 <% end %> 26 <!--%= paginate post_images %>--> 27</div> 28
relationship.rb
ruby
1コードclass Relationship < ApplicationRecord 2 3 #自分をフォローしているユーザー 4 belongs_to :follower, class_name: "User" 5 #自分がフォローしているユーザー 6 belongs_to :followed, class_name: "User" 7 #バリデーション 8 validates :follower_id, presence: true 9 validates :followed_id, presence: true 10 11end
relationships_controller.rb
ruby
1コードclass RelationshipsController < ApplicationController 2 3 4 # フォローする 5 def create 6 @user = User.find(params[:followed_id]) 7 current_user.follow(@user) 8 end 9 10 # アンフォローする 11 def destroy 12 @user = User.find(params[:id]) 13 current_user.unfollow(@user) 14 end 15 16end 17
試したこと
フォローの非同期化は以下の記事を参考に作成しております。
https://qiita.com/yuto_1014/items/8d508b84fd0c2316ba01
スペルミスがないかはくまなく探しました。
またhttps://qiita.com/yuto_1014/items/8d508b84fd0c2316ba01
の記事を参照にしました。
補足情報(FW/ツールのバージョンなど)
Rails 5.2.6
ruby 2.6.3p62
開発環境 AWS clooud9
ここにより詳細な情報を記載してください。