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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

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

Ruby

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

Q&A

解決済

1回答

1715閲覧

[Rails5.2] ECサイトにおいてカート機能実装後のエラー(NoMethodError in Devise::Sessions#new)

ozk

総合スコア9

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2020/05/11 15:36

前提

RailsでECサイトを作っています。
カート機能の作成にあたっては以下の記事の内容を少し取り入れました。
https://qiita.com/Coolucky/items/89ce3a0f25c9dfdb38c1

ユーザーが未ログイン時でも、カート機能が使えるような使用にしたいと思っています。

Rails 5.2
ログイン機能はdeviseを使用しています。

#エラー内容
イメージ説明
ヘッダーのhtml.hamlに”カートを見る”というリンクを設置しています。
エラー画面で言う、
”= link_to cart_path(@cart.id), class: "header__top__nav__cart__link" do”
の部分です。

ユーザーが未ログインでも、カートは使用できるように設定しました。
ここでいう@cartは、以下のように記述しております。

ruby

1 2class ProductsController < ApplicationController 3 before_action :set_cart 4 5 省略 6 7 private 8 def set_cart 9 @cart = current_cart 10 end 11end 12

またcurrent_cartは以下で定義しております。

ruby

1class ApplicationController < ActionController::Base 2 before_action :configure_permitted_parameters, if: :devise_controller? 3 4 rescue_from CanCan::AccessDenied do |exception| 5 render file: "#{Rails.root}/public/403.html", status: 403, layout: false 6 ## to avoid deprecation warnings with Rails 3.2.x (and incidentally using Ruby 1.9.3 hash syntax) 7 ## this render call should be: 8 # render file: "#{Rails.root}/public/403", formats: [:html], status: 403, layout: false 9 end 10 11 private 12 #セッションの作成 13 def current_cart 14 # セッションから取得したcart_idを元にCartテーブルからCart情報を取得 15 @current_cart = Cart.find_by(id: session[:cart_id]) 16 # Cart情報が存在しない場合、@current_cartを作成 17 @current_cart = Cart.create unless @current_cart 18 # 取得したCart情報よりIDを取得し、セッションに設定 19 session[:cart_id] = @current_cart.id 20 # Cart情報を返却 21 @current_cart 22 end 23 24 protected 25 def configure_permitted_parameters 26 devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname]) 27 end 28end

他のページですが、全てのコントローラーに

ruby

1private 2 def set_cart 3 @cart = current_cart 4 end

の記述をしており、問題なくページ遷移ができております。
しかし、ユーザーの認証ページに遷移しようとすると添付のようなエラーが発生しております。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

認証のページでは set_cart を呼んで居ますか?

投稿2020/05/12 02:41

winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozk

2020/05/12 04:54

回答ありがとうございます! 認証ページ(と認識している)のUserコントローラーには以下のように記載しております。 ```ruby class UsersController < ApplicationControllerdef before_action :set_cart def show end def register_card end def register_address end private def set_cart @cart = current_cart end end ```
winterboum

2020/05/12 06:33

ここではなさそうですね。 大抵 なんとかsession_controller.rb になっています。 認証画面に行く操作をして、logで確かめるという手もあります
ozk

2020/05/12 07:44

development.logには、以下のように記述されております。 ActionView::Template::Error (undefined method `id' for nil:NilClass): 11: my account 12: %i.fas.fa-user 13: %li.header__top__nav__cart 14: = link_to cart_path(@cart.id), class: "header__top__nav__cart__link" do 15: view cart 16: %i.fas.fa-shopping-cart 17: .header__middle ここでの@cartの中身はnilになっております。 頂きましたご助言への質問ですが、session_controller.rb内にnewやcreateを作成するという認識であっておりますでしょうか?? また、なんとか、というのは、app/controllers/users/sessions_controller.rbのようなことでしょうか?
winterboum

2020/05/12 07:54

いえ、見て欲しいのは、認証画面に行くときです。 その時の Started から次のStartedまでの間を見てください。 Processing by コントローラー名#method名 というのがあります。そのコントローラーのそのmethodでset_cartしているか #### >session_controller.rb内にnewやcreateを作成するという認識であっておりますでしょうか?? いえ違います。それはもうあります。そのnewに set_cartが必要です。 >また、なんとか、というのは そうです。それで見つかればよし、見つからない場合 logで探して、ということです
ozk

2020/05/12 08:16

理解不足で恐縮です。。。 指摘いただいた部分の出力は以下の通りです。(この部分でしょうか?) Started GET "/users/sign_in" for ::1 at 2020-05-12 17:00:09 +0900 Processing by Devise::SessionsController#new as HTML Rendering devise/sessions/new.html.haml within layouts/application Rendered devise/shared/_links.html.haml (4.5ms) Rendered devise/sessions/new.html.haml within layouts/application (18.4ms) Rendered layouts/_notifications.html.haml (4.4ms) Rendered layouts/_header.html.haml (16.2ms) Completed 500 Internal Server Error in 187ms (ActiveRecord: 0.0ms) ActionView::Template::Error (undefined method `id' for nil:NilClass): 11: my account 12: %i.fas.fa-user 13: %li.header__top__nav__cart 14: = link_to cart_path(@cart.id), class: "header__top__nav__cart__link" do 15: view cart 16: %i.fas.fa-shopping-cart 17: .header__middle app/views/layouts/_header.html.haml:14:in `_app_views_layouts__header_html_haml___4309596923065176329_70198032380260' app/views/layouts/application.html.haml:15:in `_app_views_layouts_application_html_haml__114331939451106292_70198034224400' ここでのDevise::SessionsControllerですが、gemのdeviseのコントローラーのため、本アプリ内には ない、というか、そもそも弄れないため、set_cartの書きようがないと認識だったのですが、 間違いでしょうか?
winterboum

2020/05/12 08:24

「set_cartの書きようがない」という判断で実装をすすめるなら、@cartがnilでも破綻しない実装にせにゃならんです。 その道を採るか Deviseのcontrollerのカスタマイズをしてそこに書くか。「Deviseのカスタマイズ」で検索すると沢山でてきます。
ozk

2020/05/12 08:43

ご助言ありがとうございます。 今ほど、問題を解消しました。 Devise::SessionsControllerがないというのは、先ほどまでは正しかったのですが、 それは作成してなかったためです。(前提条件に記載しておらず、申し訳ないです。) ”rails g devise:controllers users”コマンドを実行して、当該コントローラーを作成し before_action :set_cartで定義してあげることで、エラーを解消できました。 deviseの使い方をそもそも理解していなかったのが、原因でした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問