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

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

ただいまの
回答率

90.86%

  • Ruby

    6535questions

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

  • Ruby on Rails

    6366questions

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

コントローラーのエラー原因がわからない。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 110

komorigasa

score 3

前提・実現したいこと

ruby on railsで予約機能を作っているのですが、controllerのエラーが発生しました。
ルーティング、コントローラー、ビューを確かめたのですが、原因がわからず質問させていただきます。

初心者で、初歩的なミスかもしれませんが、ご指摘お願いいたします。

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

ActionController::ActionControllerError in ReservationsController#create
Cannot redirect to nil!
Extracted source (around line #5):

3    @reservation = current_user.reservations.create(reservation_params)
4
5     redirect_to @reservation.listing, notice:"予約が完了しました"
6  end
7
8  private

Rails.root: /Users/komorigasa/Desktop/Travelshare2

Application Trace | Framework Trace | Full Trace
app/controllers/reservations_controller.rb:5:in `create'
Request
Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"i95b+wiL2o0qhDOP8tI24bkMOSL6EsE/k2BfKRQSZHtBhxKip22jJ5Q3DemUO/rUNz6T9F+wnPAXnfh9LU6kMA==",
 "reservation"=>{"listing_id"=>"4", "price"=>"88", "total_price"=>"", "by_time"=>"09/12"},
 "commit"=>"予約する",
 "listing_id"=>"4"}

route.rb

Rails.application.routes.draw do
  resources :listings

  root :to => "pages#index"

  devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks', registrations: 'registrations' }


  resources :users, only: [:show]

  resources :photos, only: [:create, :destroy] do
    collection do
      get :list
    end
  end

  resources :listings do 
    resources :reservations, only: [:create]
  end


  get 'manage-listing/:id/basics' => 'listings#basics', as: 'manage_listing_basics'
  get 'manage-listing/:id/description' => 'listings#description', as: 'manage_listing_description'
  get 'manage-listing/:id/address' => 'listings#address', as: 'manage_listing_address'
  get 'manage-listing/:id/price' => 'listings#price', as: 'manage_listing_price'
  get 'manage-listing/:id/photos' => 'listings#photos', as: 'manage_listing_photos'
  get 'manage-listing/:id/calendar' => 'listings#calendar', as: 'manage_listing_calendar'
  get 'manage-listing/:id/bankaccount' => 'listings#bankaccount', as: 'manage_listing_bankaccount'
  get 'manage-listing/:id/publish' => 'listings#publish', as: 'manage_listing_publish'

end

reservations_controller.rb

class ReservationsController < ApplicationController
  def create
      @reservation = current_user.reservations.create(reservation_params)

      redirect_to @reservation.listing, notice:"予約が完了しました"
  end

  private
  def reservation_params
      params.require(:reservation).permit(:number, :by_time, :price, :total_price, :commodity_price)
  end
end

show.html.erb  (追記)

                <!-- 予約フォーム -->
                <div class="col-md-3">
                    <div class="panel panel-default panel-show">
                        <div class="panel-heading">
                                <span style="font-size:16px;"><%= @listing.price %>円(1荷物(=1Kgまで)の料金)</span>
                        </div>

                        <div class="panel-body panel-real">         
                            <%= form_for [@listing, @listing.reservations.new] do |f| %>


                                <!-- 予約時に一緒におくるデータ-->
                                <%= f.hidden_field :listing_id, value: @listing.id %>
                                <%= f.hidden_field :price, value: @listing.price %>
                                <%= f.hidden_field :total_price, id:'reservation_total_price' %>

                                <div class="row row-space-2">

                                    <div class="col-md-6">
                                        <label>欲しい商品の価格</label>
                                        <div class="input-group">
                                          <%= f.text_field :commodity_prices, :class => 'form-control', placeholder: '例: 1000' %>
                                        <span class="input-group-addon" id="basic-addon2"></span>
                                      </div>  
                                    </div>


                                    <div class="col-md-6">
                                        <label>期限</label>
                                        <%= f.text_field :by_time, :class => 'form-control', placeholder: '期限' %>
                                    </div>
                                </div>            

                                <div class="actions text-center">
                                    <%= f.submit "予約する", class: "btn btn-danger btn-wide" %>
                                </div>
                            <% end %>
                        </div>
                    </div>
                </div>

path

                          Prefix Verb     URI Pattern                                  Controller#Action
                        listings GET      /listings(.:format)                          listings#index
                                 POST     /listings(.:format)                          listings#create
                     new_listing GET      /listings/new(.:format)                      listings#new
                    edit_listing GET      /listings/:id/edit(.:format)                 listings#edit
                         listing GET      /listings/:id(.:format)                      listings#show
                                 PATCH    /listings/:id(.:format)                      listings#update
                                 PUT      /listings/:id(.:format)                      listings#update
                                 DELETE   /listings/:id(.:format)                      listings#destroy
                            root GET      /                                            pages#index
                new_user_session GET      /users/sign_in(.:format)                     devise/sessions#new
                    user_session POST     /users/sign_in(.:format)                     devise/sessions#create
            destroy_user_session DELETE   /users/sign_out(.:format)                    devise/sessions#destroy
user_facebook_omniauth_authorize GET|POST /users/auth/facebook(.:format)               users/omniauth_callbacks#passthru
 user_facebook_omniauth_callback GET|POST /users/auth/facebook/callback(.:format)      users/omniauth_callbacks#facebook
               new_user_password GET      /users/password/new(.:format)                devise/passwords#new
              edit_user_password GET      /users/password/edit(.:format)               devise/passwords#edit
                   user_password PATCH    /users/password(.:format)                    devise/passwords#update
                                 PUT      /users/password(.:format)                    devise/passwords#update
                                 POST     /users/password(.:format)                    devise/passwords#create
        cancel_user_registration GET      /users/cancel(.:format)                      registrations#cancel
           new_user_registration GET      /users/sign_up(.:format)                     registrations#new
          edit_user_registration GET      /users/edit(.:format)                        registrations#edit
               user_registration PATCH    /users(.:format)                             registrations#update
                                 PUT      /users(.:format)                             registrations#update
                                 DELETE   /users(.:format)                             registrations#destroy
                                 POST     /users(.:format)                             registrations#create
                            user GET      /users/:id(.:format)                         users#show
            listing_reservations POST     /listings/:listing_id/reservations(.:format) reservations#create
                                 GET      /listings(.:format)                          listings#index
                                 POST     /listings(.:format)                          listings#create
                                 GET      /listings/new(.:format)                      listings#new
                                 GET      /listings/:id/edit(.:format)                 listings#edit
                                 GET      /listings/:id(.:format)                      listings#show
                                 PATCH    /listings/:id(.:format)                      listings#update
                                 PUT      /listings/:id(.:format)                      listings#update
                                 DELETE   /listings/:id(.:format)                      listings#destroy
           manage_listing_basics GET      /manage-listing/:id/basics(.:format)         listings#basics
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

reservations_controller.rb

createで正常にパラメータが渡っていることが読み取れるため、ルーティングの問題かもしれないですね。
以下のコードのredirect_toの行を書き換えて見てください。

 def create
      @reservation = current_user.reservations.create(reservation_params)

      redirect_to @reservation.listing, notice:"予約が完了しました"
  end

以下のように書き換える

      redirect_to @reservation.listing_id, notice:"予約が完了しました"

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/10 15:35 編集

    回答ありがとうございます!
    いただいたコードに書き直したのですが、全く同じエラー文が出ました。
    showファイルに問題があるのでしょうか?

    キャンセル

  • 2018/01/10 15:40

    reservationと関係のありそうな部分を、showファイルから抜き出して追記しました。
    よろしければ、そちらも確認をお願い致します。

    キャンセル

  • 2018/01/10 15:40

    例えば redirect_to root_path だと正常に動きますでしょうか?

    キャンセル

  • 2018/01/10 15:44

    home画面に戻りました。
    root_path だと正常に動いているようです。

    キャンセル

  • 2018/01/10 15:49

    ありがとうございます。そしたらルーティングの問題だとはっきりしました。ターミナル画面にて 「rails routes」として、パス一覧を表示してみてください。そのパスにrediret_to を設定するようにしてみましょう。不明点あれが、rails routes の結果と その中でredirect させたいパスを教えていただけますと、回答がしやすくなります。お手数ですが、よろしくお願いします。

    キャンセル

  • 2018/01/10 15:57

    ありがとうございます!
    pathを追記しました。
    該当の箇所は、
    listing_reservations POST /listings/:listing_id/reservations(.:format) reservations#create
    だと思います。
    redirectさせたいのは、各userのlistingの一覧のページです。

    キャンセル

  • 2018/01/10 16:14

    redirect_to listings_path
    でlistsing一覧ページ、
    redirect_to listing_pathでlisting/:idのページへ飛ばすことができます。
    users/:id/listingsではないので指定のuserのlistingかどうかは判断しかねますが。
    またlisting_reservations は postであるためページの表示が出来ないと思われます。

    キャンセル

  • 2018/01/10 18:59

    返信が遅れてすみません。

    先ほどのredirect_toさせたいpathなのですが、userのlistingではなく、このページを更新した上で、noticeの内容を表示させるということがしたいです。
    今持っているテキスト等を調べ直しているのですが、やはりよくわかりません。
    pathはどう書けば良いのか、再度教えていただけないでしょうか?
    また、自分の書いたコードのどこが間違えていたのでしょうか?

    キャンセル

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

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    6535questions

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

  • Ruby on Rails

    6366questions

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