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

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

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

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

299閲覧

個人会員が法人会員をフォローする機能の非同期化

komai

総合スコア2

Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/07/29 06:51

前提・実現したいこと

フォローボタンの非同期化

個人会員が法人会員をフォローする機能を実装しています。
フォローボタン非同期化実装中、ターミナル上に以下のエラーメッセージが発生しました。
様々試しましたが、個人と法人間でのフォロー機能のような記事は見つからず、つまってしまいましたので質問させていただきます。
モデルは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
こちらの記事を参考にしています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

記載されたエラーは、非同期が問題というより、ActicveRecordの問題だと思います。
@companyはwhereで取得しているため、.idは取得できません。

Ruby

1@company = Company.where(id: follow.follower_id)

Ruby

1@company = Company.find(follow.follower_id)

にすればいいかと思います。(find_by(id: follow.follower_id))

投稿2020/07/29 08:03

Cojiro

総合スコア539

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

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

komai

2020/07/29 11:53

回答ありがとうございます! findにしたところ、機能しました! 似たようなものだと思っていましたが、厳密には違うんですね。 勉強になりました、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問