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

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

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

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

Q&A

解決済

1回答

786閲覧

Railsアプリで、ログイン状態により表示する項目を変更したい

suzuryu.07

総合スコア3

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/08/22 11:18

編集2021/08/22 13:09

#解決したいこと
現在、Ruby on RailsでTodoアプリを作成しています。ログイン機能を実装しているのですが、ログインしている場合としていない場合で、ヘッダーの表示を以下のように変更するよう実装したいです。
・ログインしている時 =>トップページ、タスク一覧、ログアウト
・ログインしていない時 =>トップページ、新規登録、ログイン
しかし、ログインしても表示が変わらないので、どこを修正したら良いかを質問させていただきました。

#実装したこと
Sessionを利用して、ユーザーの判別を行いました。実装したコードとディレクトリの関係を以下に挙げます。
app/controllers/sessions_controller.rb
app/controllers/sessions_helper.rb
app/controllers/users_controller.rb
app/views/layouts/application.html.erb
config/routes.rb

sessions_controller.rb

lang

1class SessionsController < ApplicationController 2 def new 3 end 4 5 def create 6 #DBからユーザーを取り出す。 7 user = User.find_by(email: params[:session][:email].downcase) 8 if user && user.authenticate(params[:session][:password]) 9 #パスワードが登録されたユーザー情報と一致したら、セッションにユーザー情報を登録する。 10 log_in user 11 redirect_to '/' 12 else 13 flash[:alert] = 'Invalid email/password combination' 14 render 'new' 15 end 16 17 end 18 19 def destroy 20 log_out 21 flash[:notice] = "Logged out!" #追加が成功した際に、flashメッセージを表示する。 22 redirect_to '/' 23 end 24end 25

application.html.erb ヘッダーの部分のみ掲載します。

html

1 <!--ヘッダー--> 2 <header> 3 <nav class="navbar navbar-expand-lg navbar-light bg-light"> 4 <div class="container-fluid"> 5 <a class="navbar-brand"><%= link_to("Todoアプリ","/")%></a> 6 <div class="collapse navbar-collapse justify-content-end" id="navbarNavAltMarkup"> 7 <div class="navbar-nav"> 8 <% if logged_in? %> 9 <a class="nav-link"><%= link_to "タスク一覧", tasks_path %></a> 10 <a class="nav-link"><%= link_to "ログアウト", logout_path %></a> 11 <% else %> 12 <a class="nav-link"><%= link_to "新規登録", new_user_path %></a> 13 <a class="nav-link"><%= link_to "ログイン", login_path %></a> 14 <% end %> 15 </div> 16 </div> 17 </div> 18 </nav> 19 20 </header>

routes.rb

ruby

1Rails.application.routes.draw do 2 get 'sessions/new' 3 get '/' => "home#top" #トップページのルーティング home:コントローラー名 top:アクション名 4 get 'login' => 'sessions#new' #新しいセッションのページ(ログイン) 5 post 'login' => 'sessions#create' #新しいセッションの作成 6 delete 'logout' => 'sessions#delete' #セッションの削除(ログアウト) 7 #resourcesメソッドを用いることで、HTTPメソッドとURLとアクションを自動的に紐付ける。 8 #Tasksコントローラーのルーティングが自動生成される。 9 resources :tasks 10 resources :users 11end

sessions_helper.rb

ruby

1module SessionsHelper 2 #渡されたユーザーでログインする。 3 #攻撃者がこの情報をcookiesから盗むことができたとしても、本物のユーザーとしてログインすることはできない。 4 def log_in(user) 5 #ユーザーのブラウザ内の一時cookiesに暗号済みのユーザーIDが自動で生成される。 6 #session[:名前]により、名前をつけてセッションに登録できる。 7 session[:user_id] = user.id 8 end 9 10 #セッションに含まれる現在のユーザーを検索する。 11 def current_user 12 #@current_user = @current_user || User.find_by(id:params[:user_id]) 13 if session[:user_id] 14 @current_user ||= User.find_by(id:params[:user_id]) 15 end 16 end 17 18 #ユーザーがログインしていればtrue,そうでなければfalseを返す。 19 def logged_in? 20 #current_user.nil?がfalseの場合(すなわち・・・)にtrueとなる。 21 !current_user.nil? 22 end 23 24 #ログイン中のユーザーをログアウトする. 25 def log_out 26 sessions.delete(:user_id) 27 @current_user = nil 28 end 29end

users_controller.rb newとcreateアクションを掲載します。

ruby

1 def new 2 @user = User.new 3 end 4 5 def create 6 @user = User.new(user_params) 7 #ユーザーの保存が成功した時 8 if @user.save 9 #登録の終わったユーザーがデフォルトでログインするように変更する。 10 log_in @user 11 flash[:notice] = "Successfully registered a new user!" #追加が成功した際に、flashメッセージを表示する。 12 redirect_to '/' 13 else 14 #flash[:alert] = "Please enter at least one character." #追加が成功した際に、flashメッセージを表示する。 15 render 'users/new' 16 end 17 end

どうぞよろしくお願いします。

#追記
実際の画像を添付します。
まず、rails consoleでダミーデータを作成しておきます。

irb(main):004:0> User.create(name: "sampleitirou", email: "itirou@example.com", password: "hogehoge", password_confirmation: "hogehoge") TRANSACTION (0.1ms) begin transaction User Exists? (0.2ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "itirou@example.com"], ["LIMIT", 1]] User Create (1.1ms) INSERT INTO "users" ("name", "email", "created_at", "updated_at", "password_digest") VALUES (?, ?, ?, ?, ?) [["name", "sampleitirou"], ["email", "itirou@example.com"], ["created_at", "2021-08-22 13:00:23.183764"], ["updated_at", "2021-08-22 13:00:23.183764"], ["password_digest", "$2a$12$sPiY0t7zYoRvdzDdLk.4L.iDlvL3srRgFTIVW3ymtQFoTc1TWZ4Qe"]] TRANSACTION (1.4ms) commit transaction => #<User id: 11, name: "sampleitirou", email: "itirou@example.com", created_at: "2021-08-22 13:00:23.183764000 +0000", updated_at: "2021-08-22 13:00:23.183764000 +0000", password_digest: [FILTERED]> irb(main):005:0>

そして、ログイン画面で登録した情報を入力します。パスワードは同じパスワードを打っています。
イメージ説明

ログインボタンを押した後の画面は以下のようになりました。もしログインに失敗していたら、フラッシュメッセージを出してnewページのままなので、ログインは出来ていると思います。
イメージ説明

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

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

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

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

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

winterboum

2021/08/22 12:10

viewもその他もおかしいところは見当たりません。 本当に login成功してますか?
suzuryu.07

2021/08/22 13:10

追記欄に画像を挿入しました。ログインに失敗していたら、render 'new'でログインページのままになるので、恐らくログインは成功していると思います。
winterboum

2021/08/22 20:40

できてますね。。。 わからん、これでなぜ駄目なのだろう
suzuryu.07

2021/08/23 00:13

ログイン自体はできているので、sessions_controller.rbは問題ないと思います。sessions_helper.rbのlogged_inメソッドかcurrent_userメソッドに問題あると思いますが、見当たらない、、、
guest

回答1

0

自己解決

session_helper内のcurrent_userメソッドの部分が間違っていました。id:paramsではなく、id:sessionでした。session[:user_id]に保存したので、そこからfind_byすることで現在のユーザーを探索することができることを考えると、凡ミスしていました。
(誤)
@current_user ||= User.find_by(id:params[:user_id])
(正)
@current_user ||= User.find_by(id:session[:user_id])

投稿2021/08/25 05:16

suzuryu.07

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問