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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2771閲覧

【Rails】フォロー機能実装時にフォローボタンが表示されない

punchan36

総合スコア105

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/01/17 09:49

前提・実現したいこと

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

しかしフォローボタンが表示されません。フォロー一覧、フォロワー一覧は正常に表示されており、うまく機能しております。エラーメッセージは表示されておらず、単純にフォローボタンが表示されません。

ボタンについて試行錯誤するも先へ進めない状況です。
お見苦しい点がございましたら申し訳ありません。
お知恵を拝借頂けると幸いです。

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

ruby

1<div class="main user-show"> 2 <div class="container"> 3 <div class="user"> 4 <img src="<%= "/user_images/#{@user.image_name}" %>"> 5 <h2><%= @user.name %></h2> 6 <p><%= @user.email %></p> 7 <% if @user.id == @current_user.id %> 8 <%= link_to("編集", "/users/#{@user.id}/edit") %> 9 <% end %> 10 </div> 11 <ul class="user-tabs"> 12 <li class="active"><%= link_to("投稿", "/users/#{@user.id}") %></li> 13 <li><%= link_to("いいね!", "/users/#{@user.id}/likes") %></li> 14 </ul> 15 <% @user.posts.each do |post| %> 16 <div class="posts-index-item"> 17 <div class="post-left"> 18 <img src="<%= "/user_images/#{post.user.image_name}" %>"> 19 </div> 20 <div class="post-right"> 21 <div class="post-user-name"> 22 <%= link_to(post.user.name, "/users/#{post.user.id}") %> 23 </div> 24 <%= link_to(post.title, "/posts/#{post.id}") %> 25 </div> 26 </div> 27 <% end %> 28 <span id="user_<%= @user.id %>" class="follow-wrapper"> 29 <%= render 'follow_form', user: @user if signed_in? %> 30 </span> 31 <h4> 32 <%= render 'users/stats' %> 33 </h4> 34 </div> 35</div>

該当のソースコード(_follow_form.html.erb)

ruby

1<% unless current_user.id == user.id %> 2 <% if current_user.following?(user) %> 3 <%= render 'users/unfollow', user: user %> 4 <% else %> 5 <%= render 'users/follow', user: user %> 6 <% end %> 7<% end %>

該当のソースコード(_follow.html.erb)

ruby

1<%= form_for(current_user.following_relationships.build(following_id: user.id), 2 remote: true) do |f| %> 3 <div><%= f.hidden_field :following_id %></div> 4 <%= f.submit "Follow", class: "btn btn-large btn-primary" %> 5<% end %>

該当のソースコード(_unfollow.html.erb)

ruby

1<%= form_for(current_user.following_relationships.find_by(following_id: user.id), 2 html: { method: :delete }, 3 remote: true) do |f| %> 4 <%= f.submit "Unfollow", class: "btn btn-large" %> 5<% end %>

該当のソースコード(user.rb)

ruby

1class 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 has_secure_password 7 8 validates :name, {presence: true} 9 validates :email, {presence: true, uniqueness: true} 10 11 def posts 12 return Post.where(user_id: self.id) 13 end 14 15 has_many :following_relationships, foreign_key: "follower_id", class_name: "Relationship", dependent: :destroy 16 has_many :followings, through: :following_relationships 17 18 has_many :follower_relationships, foreign_key: "following_id", class_name: "Relationship", dependent: :destroy 19 has_many :followers, through: :follower_relationships 20 21 def following?(other_user) 22 following_relationships.find_by(following_id: other_user.id) 23 end 24 25 def follow!(other_user) 26 following_relationships.create!(following_id: other_user.id) 27 end 28 29 def unfollow!(other_user) 30 following_relationships.find_by(following_id: other_user.id).destroy 31 end 32end

該当のソースコード(relationship.rb)

ruby

1class Relationship < ApplicationRecord 2 belongs_to :follower, class_name: "User" 3 belongs_to :following, class_name: "User" 4 validates :follower_id, presence: true 5 validates :following_id, presence: true 6end

該当のソースコード(migration create_relationships)

ruby

1class CreateRelationships < ActiveRecord::Migration[5.2] 2 def change 3 create_table :relationships do |t| 4 t.integer :follower_id 5 t.integer :following_id 6 7 t.timestamps 8 end 9 add_index :relationships, :follower_id 10 add_index :relationships, :following_id 11 add_index :relationships, [:follower_id, :following_id], unique: true 12 end 13end

試したこと

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

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

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

可能性1
<%= render 'follow_form', user: @user if signed_in? %> の signed_in? がtrueにならない

可能性2
<% unless current_user.id == user.id %> が成立しない。
つまり、login user のshowを開いている

投稿2020/01/17 11:35

winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

punchan36

2020/01/17 13:29

ご回答有難うございます。 可能性1に関しましては、もちろんサインイン(及びログイン)済みの状態で確認しております。 可能性2に関しましては、login userとは別のユーザーのshowを見てもフォローボタンが表示されません。 せめてエラーが表示されれば手掛かりがつかめるのですが、どこに問題があるのか頭打ちになっております…。
winterboum

2020/01/17 13:46 編集

するとコツコツ追いかけるしか無いかな 以下みたいにして logしてみてください <% logger.debug "@user if signed_in? #{signed_in?}" %> <%= render 'follow_form', user: @user if signed_in? %> <% logger.debug "unless current_user.id = #{current_user.id} user.id=#{user.id}" %> <% unless current_user.id == user.id %> signed_in? が怪しいのではと思っています。 そのcodeどこに有りますか?
punchan36

2020/01/22 02:54 編集

ログを辿ってみると、@user if signed_in? falseとなりました。恐らくここが原因だったようです。 ログインは出来ていた(ログイン中のユーザー名がページに表示されていた)のですが、確認の為ログアウト→ログインを試みると今度はエラーが出てログインが出来なくなりました(サインインも同様のエラーになります)。 ずっとログインした状態でページの作成をしており、ログインフォームは特にいじってなかったのですが、新たに実装した何らかのコードが原因でエラーになったのかもしれません。 まだ解決はしておりませんがベストアンサーとさせていただきます。有難うございます!
punchan36

2020/01/30 09:30

その後、全て無事解決致しました。 仰る通り「signed_in?」の部分が良くなかったです。 参考にしたサイトにあるコードを頼り過ぎて鵜呑みにしてしまい、自分のController等でしっかり定義が出来ていなかった事が原因でした。 今後は一行一行意味を考え、既存(自分)のコードときちんと関連付け、統一感を持たせる様心掛けます。 怠慢さから来る原因で申し訳ありませんでしたが、また機会がありましたら是非宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問