実現したいこと
宿泊管理アプリを作成しており、ユーザーごとに管理している施設の登録をしたいです。
発生している問題・分からないこと
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/08/19 21:02