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

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

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

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

Q&A

2回答

417閲覧

NoMethodError が解決出来ません。

G23

総合スコア20

Ruby on Rails

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

0グッド

0クリップ

投稿2024/08/04 19:50

編集2024/08/20 14:43

実現したいこと

宿泊管理アプリを作成しており、ユーザーごとに管理している施設の登録をしたいです。

発生している問題・分からないこと

deviseを使いユーザー認証を行い、そのユーザー情報に紐づけて施設の登録をするのですが、そこでタイトルのエラーが発生しており困っています。

エラーメッセージ

error

1undefined method `rooms' for nil:NilClass 2Extracted source (around line #8): 3 4 def index 5 @rooms = @current_user.rooms.all 6 end

該当のソースコード

user.rb

1class User < ApplicationRecord 2 has_many :rooms 3 4 has_one_attached :photo 5 has_many :reservations 6 has_many :guest_reviews, class_name: "GuestReview", foreign_key: "guest_id" 7has_many :host_reviews, class_name: "HostReview", foreign_key: "host_id" 8 9 10 validates :full_name, :email, presence: true, length: {maximum: 50}, allow_blank: true 11 12 13 # Include default devise modules. Others available are: 14 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 15 devise :database_authenticatable, :registerable, 16 :recoverable, :rememberable, :validatable 17end

room.rb

1class Room < ApplicationRecord 2 belongs_to :user 3 4 has_one_attached :photos 5 has_many :reservations 6 has_many :guest_reviews 7 has_many :reviews 8 9 validates :r_name, :r_self, :r_price, :r_create, :r_address, presence: true, allow_blank: true 10 validates :r_price, numericality: {only_integer: true, greater_than_or_equal_to: 1} 11 12 def average_rating 13 guest_reviews.count == 0 ? 0 : guest_reviews.average(:stars).round(2).to_i 14 end 15 16 def self.looks(search,keyword) 17 if serach == "pefect_match" 18 @room = Room.where("r_name LIKE?","#{keyword}") 19 elsif search == "forward_match" 20 @room = Room.where("r_name LIKE?","#{keyword}") 21 elsif search == "backworkd_match" 22 @room = Room.where("r_name LIKE?","#{keyword}") 23 elsif search == "partial_match" 24 @room = Room.where("r_name LIKE?","#{keyword}") 25 else 26 @room = Room.all 27 end 28 end 29 30end

rooms_controller.rb

1class RoomsController < ApplicationController 2 before_action :set_room, except: [:index, :new, :create] 3 before_action :authenticate_user!, except: [:show] 4 protect_from_forgery except: [:upload_photo] 5 before_action :is_authorised, only: [:listing, :pricing, :description, :photo_upload, :amenities, :location, :update] 6 7 8 def index 9 @rooms = current_user.rooms.all 10 end 11 12 def new 13 @room = current_user.rooms.build 14 end 15 16 def create 17 @room = current_user.rooms.build(room_params) 18 if @room.save 19 redirect_to listing_room_path(@room), notice: "保存完了" 20 else 21 flash[:alert] = "問題" 22 render :new 23 end 24 end

new.html.erb

1<h1>Rooms#new</h1> 2<p>Find me in app/views/rooms/new.html.erb</p> 3 4<div class="container"> 5 <div class="card mt-4"> 6 <div class="card-body"> 7 <h4 class="mt-4 mb-4"><b>部屋の新規登録</b></h4> 8 <%= form_for @room, multipart: true do |f| %> 9 <div class="row mb-4"> 10 <div class="col-md-4"> 11 <div class="mb-2"> 12 <label>施設名</label> 13 <%= f.text_field :r_name, 14 id: "r_name", class: "form-control" %> 15 </div> 16 </div> 17 <div class="col-md-4"> 18 <div class="mb-2"> 19 <label>写真</label> 20 <%= image_tag room_url(@room), :size => '150x100', class: "img-fluid img-thumbnail rounded-pill" %> 21 <h4 style="margin-left: 5.5rem;"></h4> 22 23 24 <button class="btn btn-info text-light w-100" type="button" data-bs-toggle="collapse" data-bs-target="#collapse1" aria-expanded="false" aria-controls="collapse1"> 25 <i class="fa-solid fa-cloud-arrow-up"></i>写真アップロード 26 </button> 27 <div class="collapse" id="collapse1"> 28 <div class="card card-body"> 29 <%= form_for :rooms, url: rooms_url(current_user), action: :update, method: :post do |form| %> 30 <%= form.file_field :photos, class: "input-group-text", onchange: "this.form.submit();" %> 31 <%= form.submit %> 32 33 34 <% end %> 35 </div> 36 37 </div> 38 </div> 39 </div> 40 <div class="row mb-4"> 41 <div class="col-md-4"> 42 <div class="mb-2"> 43 <label>紹介</label> 44 <%= f.text_area :r_self, 45 id: "r_self", class: "form-control" %> 46 </div> 47 </div> 48 <div class="col-md-4"> 49 <div class="mb-2"> 50 <label>料金</label> 51 <%= f.text_field :r_price, 52 id: "r_price", class: "form-control" %> 53 </div> 54 </div> 55 <div class="col-md-4"> 56 <div class="mb-2"> 57 <label>作成日</label> 58 <%= f.date_field :r_create, 59 id: "r_create", class: "form-control" %> 60 </div> 61 </div> 62 <div class="col-md-4"> 63 <div class="mb-2"> 64 <label>住所</label> 65 <%= f.text_field :r_address, 66 id: "r_address", class: "form-control" %> 67 </div> 68 </div> 69 <div class="col-md-4"> 70 <div class="mb-2"> 71 <label>宿泊可能人数</label> 72 <%= f.text_field :people, 73 id: "people", class: "form-control" %> 74 </div> 75 </div> 76 </div> 77 <%= f.submit "登録する", class: "btn btn-danger w-100" %> 78 <% end %> 79 </div> 80 </div> 81</div>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

作成元のサイトも確認しましたが記載したコードで作動しており、モデル間の関係も入力してるのでnillになる理由が分かりません。

補足

下記サイトを参考に作成しています。
https://mrradiology.hatenablog.jp/VacationRental

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

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

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

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

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

guest

回答2

0

user.rbの修正

User モデルに has_many :rooms と belongs_to :rooms が両方定義されていましたが、これらは矛盾していると思われます。
User は複数の Room を持つので、has_many :rooms のみを使用し、belongs_to :rooms を削除した方が良いと思います。

room.rbの修正

こちらもbelongs_to :rooms という不必要な関連が含まれているため、削除した方が良いと思います。

rooms_controller.rbの修正

deviseを使用してますでしょうか?
@current_user ではなく current_userメソッドを使用するので、current_userかと思います。
Rails deviseで使えるようになるヘルパーメソッド一覧
https://qiita.com/tobita0000/items/866de191635e6d74e392

def index @rooms = @current_user.rooms.all end

投稿2024/08/16 22:45

編集2024/08/16 22:46
JZ8xNeXY

総合スコア2

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

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

G23

2024/08/19 21:02

ご指摘有難うございます。 pryを使ってデバックし確認した所下記のようになりました。 [1] pry(#<RoomsController>)> current_user => nil [2] pry(#<RoomsController>)> rooms NameError: undefined local variable or method `rooms' for #<RoomsController:0x0000000000a708> Did you mean? rooms_url from (pry):2:in `create' [3] pry(#<RoomsController>)> build NameError: undefined local variable or method `build' for #<RoomsController:0x0000000000a708> from (pry):3:in `create' [4] pry(#<RoomsController>)> roomsはroomsテーブルとの関連付けの為のものという認識でしたが違うのでしょうか? またログイン状態にも関わらずcurrent_userがnilになる原因はなんでしょうか? 初歩以前の問題ですが、お願い致します。
guest

0

@current_usernil ということですね。
さて、この変数名は正しいでしょうか?
公式のドキュメントは英語ですが、deviseのヘルパーについてはこちらを参照してみてください。
https://github.com/heartcombo/devise?tab=readme-ov-file#controller-filters-and-helpers

投稿2024/08/04 20:34

mather

総合スコア6759

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

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

winterboum

2024/08/05 05:28

> この変数名は正しいでしょうか? それクサイですね
G23

2024/08/05 11:43

@current_userの部分をcurrent_usrに変更した所下記の部分がnill classになりました。 undefined method `build' for nil:NilClass この場合、buildの前にあるroomsがnillということでしょうか?
mather

2024/08/05 13:07

そうだと思います。
G23

2024/08/14 11:53

pryを使ってデバックし確認した所下記のようになりました。 [1] pry(#<RoomsController>)> current_user => nil [2] pry(#<RoomsController>)> rooms NameError: undefined local variable or method `rooms' for #<RoomsController:0x0000000000a708> Did you mean? rooms_url from (pry):2:in `create' [3] pry(#<RoomsController>)> build NameError: undefined local variable or method `build' for #<RoomsController:0x0000000000a708> from (pry):3:in `create' [4] pry(#<RoomsController>)> roomsはroomsテーブルとの関連付けの為のものという認識でしたが違うのでしょうか? またログイン状態にも関わらずcurrent_userがnilになる原因はなんでしょうか? 初歩以前の問題ですが、お願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問