rails初学者、エラー解消できず困ってます。
Q&A
Closed
rails room一覧、room投稿、user設定のエラー解消できず・・・
rails6で宿泊予約アプリのようなものをお勉強として作っています。
github => https://github.com/ayakuma/pote.rails2.airbnb/tree/kumaki
正常に動作していた下記3点にエラーがでてしまい、解消できずに困っています。。。
(ルーム一覧)rooms/index
(ルーム投稿)rooms/new
(ユーザー設定)users/edit
思い当たる節としては、以下のようなルーティングにしたく、routesとコントローラーをいじったりしていました。
* rooms/:id(予約ページ) → rooms/confirm(予約確認ページ) → rooms/posts(予約一覧)
エラーが発生したので、routes,(users,rooms/)controllerはエラー発生前に戻しました。
しかし解消できず、エラー内容からの解消方法も調べたものの分からず、袋小路となってしまいました。
それぞれのエラー文は以下の通りです。
発生している問題・エラー
1、右上メニューから「ルーム登録」 → 登録するを押す → エラー
ActionController::UrlGenerationError in RoomsController#create No route matches {:action=>"show", :controller=>"rooms", :id=>nil}, missing required keys: [:id]
=====
(UsersController)
def show @user = User.find(params[:id]) end
=====
2、右上のメニューから、「設定」を押す → エラー
ActiveRecord::RecordNotFound in UsersController#show Couldn't find User with 'id'=show
=====
(RoomsController)
redirect_to room_path(@room)
=====
3、右上のメニューから、「ルーム一覧」を押す → エラー
ArgumentError in Rooms#index Showing /Users/kumakiayaka/Desktop/ayabnb/app/views/rooms/index.html.erb where line #10 raised: Nil location provided. Can't build URI.
=====
(rooms/index.html.erb)
<%= image_tag room.image.url ,class:"room_index_img"%>
=====
自分で試したこと
コントローラーの記述の確認。
ルーティングの確認。
リダイレクト先に間違えがないか。
該当するソースコード
routes.rb
Rails.application.routes.draw do
get 'rooms/index'
get 'rooms/new'
get 'rooms/show'
get 'rooms/edit'
devise_for :users
get "/" => 'rooms#top'
get "users/index" => "users#index"
get "users/:id" => "users#show"
get "users/:id/edit"=>"users#edit"
get "rooms/new" => "rooms#new"
resources :users
resources :rooms
devise_scope :user do
get 'profile_edit', to: 'users/registrations#profile_edit', as: 'profile_edit'
patch 'profile_update', to: 'users/registrations#profile_update', as: 'profile_update'
end
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
users.controller.rb
class UsersController < ApplicationController
def index
@users = User.all
end
def new
@user = User.new
end
def create
@user = User.new(name: params[:name], email: params[:email], password: params[:password], img: "home.jpg",)
if @user.save
flash[:notice] = "ユーザー登録が完了しました"
redirect_to ("/users/#{@user.id}")
else
render "new"
end
end
def show
@user = User.find(params[:id])
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
# if params[:img]
# @user.img = "#{@user.id}.jpg"
# image = params[:img]
# File.binwrite("/#{@user.img}", image.read)
# end
if @user.update(email: params[:email], password: params[:password],name: params[:name],img: params[:img], introduction: params[:introduction])
redirect_to("/users/index")
else
render ("/users/index")
end
end
def destroy
@user = User.find(params[:id])
@user.destroy
redirect_to ("/users/index")
end
def account
@user = User.find(params[:id])
end
# ログイン済ユーザーのみにアクセスを許可する
before_action :authenticate_user!
end
rooms.controller.rb
class RoomsController < ApplicationController
def index
@rooms = Room.all
end
def new
@room = Room.new
end
def create
@room = Room.new(room_params)
@room.user_id = current_user.id
@room.save
redirect_to room_path(@room)
end
def show
@room = Room.find(params[:id])
end
def edit
@room = Room.find(params[:id])
end
def update
@room = Room.find(params[:id])
@room.update(room_params)
redirect_to room_path(@room)
end
private
def room_params
params.require(:room).permit(:name, :introduction, :price ,:address ,:image )
end
end
rooms/index.html.erb
<div class="room_index_view">
<h2>ルーム一覧</h2>
<div class="card-deck">
<% @rooms.each do |room| %>
<div class="col-sm-6 col-lg-4 col-xl-3">
<div class="card">
<%= image_tag room.image.url ,class:"room_index_img"%>
<div class="card-body">
<h5 class="card-title"><%= room.name %></h5>
<p class="card-text"> <%= simple_format room.introduction %></p>
<p class="card-text"> <%= room.address %></p>
<p class="card-text"><small class="text-muted"> <%= number_to_currency(room.price, :unit => "円") %> / 日</small></p>
<a href="/rooms/show" class="stretched-link"></a>
</div>
</div>
</div>
<% end %>
</div>
<table>
<thead>
<tr>
<th>ID</th>
<th>画像</th>
<th>ホテル名</th>
<th>紹介文</th>
<th>住所</th>
<th>投稿日</th>
<th>確認</th>
<th>編集</th>
<th>削除</th>
</tr>
</thead>
<tbody>
<% @rooms.each do |room| %>
<tr>
<td><%= room.id %></td>
<td><%= image_tag room.image.url , :width => '50'%></td>
<td><%= room.name %></td>
<td><%= room.introduction %></td>
<td><%= room.address %></td>
<td><%= room.updated_at.strftime('%Y月%m日%d日') %></td>
<td><%= link_to "確認", room, class:"textdeco"%></td>
<td><%= link_to "編集", [:edit, room], class:"textdeco" %></td>
<td><%= link_to "削除", room, method: :delete, data:{confirm:"本当に削除しますか?"}, class:"textdeco" %></td>
<% end %>
</tbody>
</table>
</div>
rooms/show.html.erb
<div class="room_show">
<h1 fontsize="14">ルーム予約画面</h1>
<div class="d-flex flex-wrap">
<div class="col-sm-8 ">
<div class="card mb-8">
<%= image_tag @room.image.url ,:height=>'300',class:"room_show_img"%>
<div class="card-body">
<% if current_user.img? %>
<%= image_tag current_user.img.url ,:height=>"40", class:"usericon" %>
<% else %>
<%= image_tag "default.png" ,:height=>"40" , class:"usericon" %>
<% end %>
<div class="room_show_name">
<h4 class="card-title"><%= @room.name %></h5>
<font size="2",class="card-text",fornsize="2"><%= @room.address %></font><br>
</div>
<hr size=".5px" color="#bbb">
<p class="card-text"> <%= simple_format @room.introduction %></p>
</div>
</div>
</div>
<div class="col-sm-4">
<div class="room_show_container">
<%= form_for @room do |f| %>
<h5>
<%= number_to_currency(@room.price, :unit => "円") %> / 日
</h5>
<hr size=".5px" color="#bbb">
<div class="form-group">
<label for="exampleInputEmail1">開始日</label><br>
<%= f.date_field :startday ,class:"form-control"%>
<%# <input type="date" class="form-control" id="exampleInputstartday" aria-describedby="emailHelp" placeholder="Enter email"> %>
</div>
<div class="form-group">
<label for="exampleInputPassword1">終了日</label><br>
<%= f.date_field :endday ,class:"form-control"%>
<%# <input type="date" class="form-control" id="exampleInputendday" placeholder="Password"> %>
</div>
<%= f.submit "予約確認画面へ" ,class:"btn btn-primary"%>
<% end %>
</div>
</div>
</div>
</div>
users/show.thml.erb
<div class="container">
<ul>
<li><%= link_to("アカウント","/users/show",class:"active") %></li>
<li><%= link_to("プロフィール",profile_edit_path) %></li>
</ul>
<div class="profile_container">
<div class="profile_box">
<h2>アカウント編集</h2>
<div class="show_container">
<hr size="1px" color="#e7e7e7">
<div class="show_pass">
<h4>メールアドレス</h4>
<p><%= current_user.email %></p>
</div>
<hr size="1px" color="#e7e7e7">
<div class="show_pass">
<h4>パスワード</h4>
<p>******</p>
</div>
<hr size="1px" color="#e7e7e7">
</div>
<div class="edit_btn">
<%= link_to("編集",edit_user_registration_path)%>
</div>
</div>
</div>
</div>
0