前提・実現したいこと
◾️前提
ProgateのRailsコースを終了し、cloud9上でrailsコースの最終版ソースコードをいじっていこうと思ったのですが、
以下のような問題が発生し早速つまづいております。
有識者の皆様のお知恵をお貸しいただければ幸いでございます。
情報として不充分な点がございましたらお申し付けください。
何卒よろしくお願いいたします。
◾️エラー内容
ProgateのRailsコースのソースコードをcloud9で動作させた際にログインができない。
Progate上では問題なくログイン動作が可能であるのに、cloud9上ではログインができなくて悩んでいます。
ログインフォームにemail,passwordを押してログインボタンを押下すると下記の画面になる。
(ヘッダーのメニューがログイン後の内容に変わっていない、ログインを知らせるflashも表示されない)
(投稿内容が表示されていないのはDBに投稿内容がないので問題ないです。)
◾️ログインフォーム
◾️ログインボタン押下後(現状)
◾️ログインボタン押下後(Progate)
発生している問題・エラーメッセージ
原因としては、
application.contoroller.rbの
@current_user = User.find_by(id: session[:user_id])にある
session[:user_id]に値が入っていなく
@current_userが
nilになっていることが色々試していく中で分かったのですが、
なぜuserscontroller.rbのdef login内で定義した
session[:user_id] = @user.idが保存されていないのか
ググってっも分からず、、
該当のソースコード
applicationcontroller.rb
class ApplicationController < ActionController::Base before_action :set_current_user def set_current_user @current_user = User.find_by(id: session[:user_id]) end def authenticate_user if @current_user == nil flash[:notice] = "ログインが必要です" redirect_to("/login") end end def forbid_login_user if @current_user flash[:notice] = "すでにログインしています" redirect_to("/posts/index") end end end
◾️userscontroller.rb
class UsersController < ApplicationController before_action :authenticate_user, {only: [:index, :show, :edit, :update]} before_action :forbid_login_user, {only: [:new, :create, :login_form, :login]} before_action :ensure_correct_user, {only: [:edit, :update]} def index @users = User.all end def show @user = User.find_by(id: params[:id]) end def new @user = User.new end def create @user = User.new( name: params[:name], email: params[:email], image_name: "default_user.jpg", password: params[:password] ) if @user.save session[:user_id] = @user.id flash[:notice] = "ユーザー登録が完了しました" redirect_to("/users/#{@user.id}") else render("users/new") end end def edit @user = User.find_by(id: params[:id]) end def update @user = User.find_by(id: params[:id]) @user.name = params[:name] @user.email = params[:email] if params[:image] @user.image_name = "#{@user.id}.jpg" image = params[:image] File.binwrite("public/user_images/#{@user.image_name}", image.read) end if @user.save flash[:notice] = "ユーザー情報を編集しました" redirect_to("/users/#{@user.id}") else render("users/edit") end end def login_form end def login @user = User.find_by(email: params[:email]) if @user && @user.authenticate(params[:password]) session[:user_id] = @user.id flash[:notice] = "ログインしました" redirect_to("/posts/index") else @error_message = "メールアドレスまたはパスワードが間違っています" @email = params[:email] @password = params[:password] render("users/login_form") end end def logout session[:user_id] = nil flash[:notice] = "ログアウトしました" redirect_to("/login") end def likes @user = User.find_by(id: params[:id]) @likes = Like.where(user_id: @user.id) end def ensure_correct_user if @current_user.id != params[:id].to_i flash[:notice] = "権限がありません" redirect_to("/posts/index") end end end
◾️postscontroller.rb
class PostsController < ApplicationController before_action :authenticate_user before_action :ensure_correct_user, {only: [:edit, :update, :destroy]} def index @posts = Post.all.order(created_at: :desc) end def show @post = Post.find_by(id: params[:id]) @user = @post.user @likes_count = Like.where(post_id: @post.id).count end def new @post = Post.new end def create @post = Post.new( content: params[:content], user_id: @current_user.id ) if @post.save flash[:notice] = "投稿を作成しました" redirect_to("/posts/index") else render("posts/new") end end def edit @post = Post.find_by(id: params[:id]) end def update @post = Post.find_by(id: params[:id]) @post.content = params[:content] if @post.save flash[:notice] = "投稿を編集しました" redirect_to("/posts/index") else render("posts/edit") end end def destroy @post = Post.find_by(id: params[:id]) @post.destroy flash[:notice] = "投稿を削除しました" redirect_to("/posts/index") end def ensure_correct_user @post = Post.find_by(id: params[:id]) if @post.user_id != @current_user.id flash[:notice] = "権限がありません" redirect_to("/posts/index") end end end
◾️login_form.html.erb
<div class="main users-new"> <div class="container"> <div class="form-heading">ログイン</div> <div class="form users-form"> <div class="form-body"> <% if @error_message %> <div class="form-error"> <%= @error_message %> </div> <% end %> <%= form_tag("/login") do %> <p>メールアドレス</p> <input name="email" value="<%= @email %>"> <p>パスワード</p> <input type="password" name="password" value="<%= @password %>"> <input type="submit" value="ログイン"> <% end %> </div> </div> </div> </div>
◾️route.rb
Rails.application.routes.draw do post "likes/:post_id/create" => "likes#create" post "likes/:post_id/destroy" => "likes#destroy" post "users/:id/update" => "users#update" get "users/:id/edit" => "users#edit" post "users/create" => "users#create" get "signup" => "users#new" get "users/index" => "users#index" get "users/:id" => "users#show" post "login" => "users#login" post "logout" => "users#logout" get "login" => "users#login_form" get "users/:id/likes" => "users#likes" get "posts/index" => "posts#index" get "posts/new" => "posts#new" get "posts/:id" => "posts#show" post "posts/create" => "posts#create" get "posts/:id/edit" => "posts#edit" post "posts/:id/update" => "posts#update" post "posts/:id/destroy" => "posts#destroy" get "/" => "home#top" get "about" => "home#about" end
◾️gemfile
source 'https://rubygems.org' gem 'rails', '5.0.3' # Use Puma as the app server gem 'puma', '3.6.2' # Use SCSS for stylesheets gem 'sass-rails', '5.0.6' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '3.0.4' gem 'pry-rails', '0.3.4' # Use jquery as the JavaScript library gem 'jquery-rails', '4.2.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '5.0.1' gem 'bcrypt' group :development, :test do gem 'sqlite3', '1.3.13' gem 'byebug', '9.0.6', platform: :mri gem 'web-console', '3.4.0' gem 'listen', '3.0.8' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring', '2.0.1' gem 'spring-watcher-listen', '2.0.1' end
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。