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

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

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

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

Q&A

解決済

3回答

381閲覧

undefined methodのエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2022/10/07 09:36

編集2022/10/08 11:09

前提

controllerで取得したデータをif文の条件で使いたいのですがエラーが発生しました。
メソッドが見つからないのはなぜでしょうか?

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

!更新10/07 21:55

NoMethodError at /plans/18 undefined method `plan_id' for #<ActiveRecord::Relation [#<Room id: 1, room_name: "aaaaaaaaaaaaaa", created_at: "2022-10-07 13:07:47.438365000 +0900", updated_at: "2022-10-07 13:07:47.438365000 +0900", plan_id: 18>]>

該当のソースコード

!更新10/08 0:30

plans_controller.rb

1@room = Room.all.find_by(plan_id: @plan.id)

!更新10/07 21:55

views/plans/show.html.erb

1<% if @plan.id == @room %> 2 <p class="user-show-room"><a href="/rooms/<%= @roomId %>"class="btn btn-primary btn-lg">メッセージ</a> 3<% end %>

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

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

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

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

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

guest

回答3

0

ベストアンサー

@room = Room.all.find_by(plan_id: @plan.id)
if @room
@alreadyRoom = true
else
@alreadyRoom = false
end
で合否判定して
views/plans/show.html.erbのボタンの出現の分岐で
<% if @alreadyRoom == true%>
<p class="user-show-room"><a href="/rooms/<%= @roomId %>"class="btn btn-primary btn-lg">メッセージ</a>
<% end %>
を行うと、エラーはなくなりましたが、応募ボタンは出現しなくなりました。
また、原因を調べてみたいと思います。

投稿2022/10/08 02:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

メソッドが見つからないのはなぜでしょうか?

以前にも同じことを回答しましたが、リレーションに対して1レコードを前提としたメソッドを呼び出すことはできません。名前は@roomと単数形ですが、中身はRoom.allで全レコードを入れています。

投稿2022/10/07 10:21

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2022/10/07 12:57

rooms.plan_idをwhereで特定して、受け渡してみたのですがうまくいきませんでした。 whereでの特定がいけなかったのでしょうか?
maisumakun

2022/10/07 13:19 編集

> whereでの特定がいけなかったのでしょうか? whereに指定している@rooms.plan_idが成立しないです(最初の回答と全く同じ状況です)。
maisumakun

2022/10/07 13:22

コードを考えて書いていますか? (直前に入れた指摘すら回避できないようなコードを作り上げているのを見ると、違ったからとりあえず変えてみよう、と当てずっぽうに触っているように見えてしまいます)
退会済みユーザー

退会済みユーザー

2022/10/07 13:23

つまり複数ではなく一つに限定しなければならないということですか? @roomsではなく@roomでレコードから一つとりだすというような
maisumakun

2022/10/07 13:24

> つまり複数ではなく一つに限定しなければならないということですか? そうですね、「どの」Roomを取得したいのか、条件をはっきりさせる必要があります。
退会済みユーザー

退会済みユーザー

2022/10/07 15:48 編集

すみません。 また当てずっぽうといわれてしまうかもしれませんが 下記のサイトを参考に作成し http://www.code-magagine.com/?p=9847 @room = Room.all.find_by(plan_id: @plan.id) find_byでplan_idと同じ@plan.idのroomを1つ取り出すようにしてみたら、事前にDMが作成されていた掲載のshowページはエラーなく見れたのですが、まだDmが作成されていないやつの掲載のshowページはエラーが発生してしまいました、 ・エラー NoMethodError at /plans/16 undefined method `plan_id' for nil:NilClass <% if @plan.id == @room.plan_id %> おそらく@room.plan_idがnilだからだと思うのですが、これは上記のレコードの取り出し方をまた変えたほうが良いのでしょうか? それともif文のコードを修正したほうがいいのでしょうか?
guest

0

ruby

1 if @isRoom 2 else 3 @room = Room.new 4 @entry = Entry.new 5 end

普通このブロックに入ってるからじゃないでしょうか?
newした状態だと呼び出せなかったような気が、、

投稿2022/10/07 09:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/10/07 09:43

sを付けてメソッドを差別化したほうがよかったですか? @rooms = Room.all.select(:id,:room_name,:plan_id)
退会済みユーザー

退会済みユーザー

2022/10/07 09:52

あー、ごめんなさい見るところ間違えてました @roomに値が何も入ってないからじゃないですかね?
退会済みユーザー

退会済みユーザー

2022/10/07 10:12

すみません。 エラーで調べたのですが、これは値が入っていないのでしょうか? てっきり入っていると思ったいたのですが、、、 >> @room => #<ActiveRecord::Relation [#<Room id: 1, room_name: "aaaaaaaaaaaaaa", plan_id: 18>]>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問