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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

5462閲覧

rails undefined method エラー

mikan0777

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2020/03/15 11:40

前提・実現したいこと

<エラーが出るまでの背景>
〇connectionsテーブルのauthorityカラムの値を得るために
Connectionオブジェクト.authorityとしたがundefined method...というエラーになる

<開発環境>
awsのcloud9でrubyonrailsを利用してweleveという名前のwebアプリケーションを開発しています。
DBはMySQLを利用しています。

発生している問題・エラーメッセージ

NoMethodError in GroupsController#show undefined method `authority' for #<Connection::ActiveRecord_Relation:0x0000000005dec9e8> Extracted source (around line #7):

該当のソースコード

groups_controller.rb

def show @conne=Connection.where(student_id: current_student.id) if current_student.groups.present?&&@conne.authority # もし生徒がグループアカウントに紐づけられてて、かつauthorityがtrueなら # プロフィールアイコンから自分のグループページへ @group=current_student.groups # @group.idだとエラー @group.idsにする @events=Event.where(group_id: @group.ids).order("created_at DESC").page(params[:page]).per(3) else # 普通にグループページを見るとき @group=Group.find(params[:id]) @events=Event.where(group_id: @group.id).order("created_at DESC").page(params[:page]).per(3) end @today=Date.today end

試したこと

〇@conneがnilではないか⇒デバック(binding.pryと記入)で検証

5: def show
6: @conne=Connection.where(student_id: current_student.id)
=> 7: binding.pry
8: if current_student.groups.present?&&@conne.authority
9: # もし生徒がグループアカウントに紐づけられてて、かつauthorityがtrueなら
10: # プロフィールアイコンから自分のグループページを見るとき
11: @group=current_student.groups
12: # @group.idだとエラー @group.idsにする
13: @events=Event.where(group_id: @group.ids).order("created_at DESC").page(params[:page]).per(3)
14: else
15: # 普通にグループページを見るとき
16: @group=Group.find(params[:id])
17: @events=Event.where(group_id: @group.id).order("created_at DESC").page(params[:page]).per(3)
18: end
19:
20: @today=Date.today
21:
22: end

[1] pry(#<GroupsController>)> @conne
Connection Load (0.3ms) SELECT connections.* FROM connections WHERE connections.student_id = 1
↳ app/controllers/groups_controller.rb:7
=> [#<Connection:0x0000000003f26e78 id: 2, student_id: 1, group_id: 1, created_at: nil, updated_at: Sun, 15 Mar 2020 11:05:35 UTC +00:00, authority: true>]
[2] pry(#<GroupsController>)> @conne.authority
NoMethodError: undefined method authority' for #<Connection::ActiveRecord_Relation:0x00000000043ad7f8> from /home/ec2-user/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.4.1/lib/active_record/relation/delegation.rb:125:in method_missing'
[3] pry(#<GroupsController>)>

@conneがnilなのかと思い、デバックしてみたのですが、@conneにはConnectionクラスのインスタンス(connectionsテーブルのカラム)が代入されているようです。

〇サーバーが起動していない状態でrails c としてauthorityメソッドが使えるか検証
ec2-user:~/environment/weleve (master) $ rails c
Running via Spring preloader in process 5948
Loading development environment (Rails 5.2.4.1)
[1] pry(main)> conne=Connection.find(2)
(0.3ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
Connection Load (0.2ms) SELECT connections.* FROM connections WHERE connections.id = 2 LIMIT 1
=> #<Connection:0x00000000059c28e0 id: 2, student_id: 1, group_id: 1, created_at: nil, updated_at: Sun, 15 Mar 2020 11:05:35 UTC +00:00, authority: true>
[2] pry(main)> conne.authority
=> true

となり、undefined method...というエラーにはなりません。

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

いろいろ調べてみたのですが全く解決できそうにないので質問させていただきました。どなたがご教授いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

@conne.authority という形で使うには、@conne はインスタンスでなければなりません。ですが
@conne=Connection.where(student_id: current_student.id)
なので、インスタンスではなく インスタンスの配列(の様なもの。ActiveRecord_Relation)になっています。
@conne=Connection.where(student_id: current_student.id).first
@conne=Connection.find_by(student_id: current_student.id)
などとしてください

投稿2020/03/15 14:39

winterboum

総合スコア23329

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

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

mikan0777

2020/03/17 11:00

解決出来ました!!!! そうだったんですね。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問