ayaka-k
@ayaka-k (あやか)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

No Answers yet.

Your answer might help someone💌