前提・実現したいこと
フォローボタンの非同期化
個人会員が法人会員をフォローする機能を実装しています。
フォローボタン非同期化実装中、ターミナル上に以下のエラーメッセージが発生しました。
様々試しましたが、個人と法人間でのフォロー機能のような記事は見つからず、つまってしまいましたので質問させていただきます。
モデルはcompanyとuserで分けています。
非同期ではないフォロー機能は実現できております。
非同期に詳しい方おられましたら、アドバイスいただけると幸いです。
発生している問題・エラーメッセージ
ActionView::Template::Error (undefined method `id' for #<Company::ActiveRecord_Relation:0x00007fe0940e9328> Did you mean? ids): 1: $("#follow_button_<%= @company.id %>").html("<%= j(render 'public/shared/follow_button', company: @company) %>"); app/views/public/relationships/destroy.js.erb:1:in `_app_views_public_relationships_destroy_js_erb___2576511531470315012_70301266745840'
該当のソースコード
ruby
1class Company < 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 :passive_relationships, class_name: "Relationship", foreign_key: :follower_id 8 has_many :followers, through: :passive_relationships, source: :following 9 has_many :articles 10 has_many :contacts 11 attachment :profile_image 12 attachment :background_image 13 14 def followed_by?(user) 15 passive_relationships.find_by(following_id: user.id).present? 16 end 17end
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 7 has_many :favorites 8 has_many :favorite_articles, through: :favorites, source: :article 9 has_many :active_relationships, class_name: "Relationship", foreign_key: :following_id 10 has_many :followings, through: :active_relationships, source: :follower 11 has_many :contacts 12 attachment :profile_image 13
ruby
1class Public::RelationshipsController < ApplicationController 2 def create 3 follow = current_user.active_relationships.build(follower_id: params[:user_id]) 4 @company = Company.where(id: follow.follower_id) 5 follow.save 6 # redirect_back(fallback_location: root_path) 7 end 8 9 def destroy 10 follow = current_user.active_relationships.find_by(follower_id: params[:user_id]) 11 @company = Company.where(id: follow.follower_id) 12 follow.destroy 13 # redirect_back(fallback_location: root_path) 14 end 15end 16
js
1$("#follow_button_<%= @company.id %>").html("<%= j(render 'public/shared/follow_button', company: @company) %>");
html
1<% companies.each do |company| %> 2 <div class="row"> 3 <div class="col-xs-3"> 4 <%= attachment_image_tag company, :profile_image, class: "col-xs-12", fallback: "no_image.png" %> 5 </div> 6 <div class="col-xs-9"> 7 <h4><%= link_to company.company_name, company_path(company.id) %></h4> 8 <p><%= truncate(company.introduction, length: 100) %></p> 9 <div id="follow_button_<%= company.id %>"> 10 <%= render 'public/shared/follow_button', company: company %> 11 </div> 12 </div> 13 </div> 14 <hr class="companyHr"> 15<% end %>
html
1<% if user_signed_in? %> 2 <% if current_user != company %> 3 <% if company.followed_by?(current_user) %> 4 <%= link_to "フォロー済み", user_relationships_path(company.id), method: :delete, class:"btn btn-primary btn-sm", remote: true %> 5 <% else %> 6 <%= link_to "フォローする", user_relationships_path(company.id), method: :post, class:"btn btn-default btn-sm", remote: true %> 7 <% end %> 8 <% end %> 9<% end %>
試したこと
コントローラで@companyを定義し、idの情報を取得できているはずなのですが、js.erbの方にうまく渡せていない様子。
おそらく残りはjs.erbの部分だけで実現できるのではないかとは思っています。
補足情報(FW/ツールのバージョンなど)
https://qiita.com/naberina/items/c6b5c8d7756cb882fb20
https://qiita.com/yuto_1014/items/8d508b84fd0c2316ba01
こちらの記事を参考にしています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/29 11:53