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

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

ただいまの
回答率

91.05%

  • Ruby

    6155questions

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

  • Ruby on Rails 5

    652questions

pathのエラー、pathの書き方がわからない。

解決済

回答 2

投稿 編集

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

komorigasa

score 3

前提・実現したいこと

ルーティング、コントローラー、ビューを確かめたのですが、原因がわからず質問させていただきます。
エラーメッセージから、おそらくcontrollerのどこかなのだと思います。
やりたいことは、createしたページを更新した上で、noticeの内容を表示させる、です。
データベースへの保存をした状態で、このページを再度開きたいのです。
つまり、pathはこのページです。

先ほど、root_pathに飛ばせることは確かめました。
しかし、この時はデータベースへの保存はされていませんでした。

ご教授のほど、よろしくお願いいたします。

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

おそらく、pathの書き方が違うと思うのですが・・・
今持っているテキスト等を調べ直しているのですが、よくわかりません。
pathはどう書けば良いのか、教えていただけないでしょうか?
また、自分の書いたコードのどこが間違えているのでしょうか?

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

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

0

pathではなく、flashの書き方を間違えていたようです。
使っているテキストがrails4だったのですが、rails5では書き方が変わっていたようですね。
変化に合わせて、テキストも変えないとダメだなと思いました。
反省です。

reservations_controller.rb

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

      redirect_to @reservation.listing
      flash[:notice] = "予約が完了しました"
  end



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

flashは続けて書いてはいけないそうです。
行を変えて、書くとエラーが消えました。
おそらく単純ミスですよね。
勉強しないとダメですね。
回答していただいたsatoshih様、ありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

reservation_params (strong_parameter)で指定しているkeyに listing_id が含まれていないため、

current_user.reservations.create(reservation_params)


で作成されたReservationListingが紐づいてないんじゃないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/11 17:04

    回答ありがとうございます。
    controllerのreservation_paramsに書き加えてみました。

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

    redirect_to listing_reservations_path, notice:"予約が完了しました"
    end



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

    このようにすれば良いのでしょうか?

    また、上の場合だと、エラーの内容が変わり、ルートのエラーが発生する為、indexを加えたのですが、それでもpathがないとのエラーが出てしまいました。
    具体的な作業としては何をすれば良いのでしょうか?
    質問が色々と変わってしまい申し訳ありませんが、よろしくお願いいたします。

    キャンセル

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

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

関連した質問

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

  • Ruby

    6155questions

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

  • Ruby on Rails 5

    652questions