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

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

ただいまの
回答率

88.62%

ログイン認証と一対多をタスク管理アプリに追加する

受付中

回答 0

投稿

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

SUGAI-AYAKA

score 0

前提・実現したいこと

tasklistにログイン認証機能を付けてログインしているユーザーが自身の作成したタスクのみにアクセスできるようにする。ユーザー登録に失敗した際なぜ登録できなかったかわかるようにバリデーションエラーメッセージを表示してログインユーザーが登録したタスクのみを操作できるようタスクにユーザーの紐付けをする。
rootのルーティング(/)はtasks/indexとする。ユーザーログイン後はroot(/)へ遷移しログインユーザーが登録したタスクを一覧表示してください。

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

```
エラーメッセージ
https://.com/33b66ab99773cd645182203127fab298
uninitialized constant ApplicationController::SessionsHelpe
Rails.root: /home/ec2-user/environment/tasklist

Application Trace | Framework Trace | Full Trace
app/controllers/application_controller.rb:3:in <class:ApplicationController>' app/controllers/application_controller.rb:1:in <top (required)>'
app/controllers/tasks_controller.rb:1:in `<top (required)>'

該当のソースコード

route.rb
Rails.application.routes.draw do

root to: 'tasks#index'

get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'

get 'signup', to: 'users#new'

resources :users, only: [:index, :show, :new, :create]

resources :tasks
end
https://gyazo.com/79cb115186c1aac0f5ca96ced6b660cf

*application_controller.rb

class ApplicationController < ActionController::Base
before_action :login_required
include SessionsHelpe

private

def require_user_logged_in
unless logged_in?
redirect_to login_url
end
end
end

https://gyazo.com/74ca68ba25025610853a055a4d5f3201

*sessions_controller*

https://gyazo.com/ca04a5a227aa2292879d39a93761caa9

class SessionsController < ApplicationController
def new
end

def create
email = params[:session][:email].downcase
password = params[:session][:password]
if login(email, password)
flash[:success] = 'ログインに成功しました。'
redirect_to root_url
else
flash.now[:danger] = 'ログインに失敗しました。'
render :new
end
end

def destroy
session[:user_id] = nil
flash[:success] = 'ログアウトしました。'
redirect_to root_path
end

private

def login(email, password)
@user = User.find_by(email: email)
if @user && @user.authenticate(password)

ログイン成功

session[:user_id] = @user.id
return true
else

ログイン失敗

return false
end
end

*user_controller*
https://gyazo.com/6ad0a21581bab51b91982ffa9f9378c8

class UsersController < ApplicationController
before_action :require_user_logged_in

def index

end

def show
@user = User.find(params[:id])
@task = @user.tasks
end

def new
@user = User.new
end

def create
@user = User.new(user_params)

if @user.save
flash[:success] = 'ユーザを登録しました。'
redirect_to root_url
else
flash.now[:danger] = 'ユーザの登録に失敗しました。'
render :new
end
end

private

def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end

*tasks_controller.rb*
https://gyazo.com/84c61469c7e116b94e86ab2df96a58c3

class TasksController < ApplicationController
before_action :require_user_logged_in

def index
@tasks = current_user.tasks
end

def show
@task = current_user.tasks.find(params[:id])
end

def new
@task = Task.new
end

def create
@task = current_user.tasks.build(task_params)
if @task.save
flash[:success] = 'Task が正常に投稿されました'
redirect_to @task
else
flash.now[:danger] = 'Task が投稿されませんでした'
render :new
end
end

def edit
@task = current_user.tasks.find(params[:id])
end

def update
@task = current_user.tasks.find(params[:id])

if @task.update(task_params)
def update
@task = current_user.tasks.find(params[:id])

if @task.update(task_params)
flash[:success] = 'Task は正常に更新されました'
redirect_to @task
else
flash.now[:danger] = 'Task は更新されませんでした'
render :edit
end
end

def destroy
current_user.tasks.find(params[:id])
@task.destroy

flash[:success] = 'Taskは正常に削除されました'
redirect_to tasks_url
end

private

Strong Parameter

def task_params
params.require(:task).permit(:content, :status)
end

def correct_user
@task = current_user.tasks.find_by(id: params[:id])
unless @task
redirect_to root_url
end
end
end

*application_helper.rb*

module ApplicationHelper
end

*sessions_helper.rb*
https://gyazo.com/e60af03d3156e1c2a5c28e2bc17ee932

module SessionsHelper
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end

def logged_in?
!!current_user
end
end

*users_helper.rb
module UsersHelper
end

*app/views/tasks*
index.html.erb
https://gyazo.com/2b2077bd3619627762cdd6f237963414

<% if logged_in? %>
<h1>タスク一覧</h1>

<ul>
<% @tasks.each do |task| %>
<li><%= link_to task.id, task %> : <%= task.status %> &gt; <%= task.content %></li>
<% end %>
</ul>

<% end %>
<%= link_to '新規タスクの投稿', new_task_path %>

*app/views/tasks/show.html.erb
https://gyazo.com/4b5e339d9f6f1835c970b51cc9cf4350
<h1>id: <%= @task.id %>のタスク詳細ページ</h1>

<p>ステータス:<%= @task.status %></p>
<p>タスク:<%= @task.content %></p>

<%= link_to '一覧に戻る', tasks_path %>
<%= link_to 'このタスクを編集する', edit_task_path(@task) %>
<%= link_to 'このタスクを削除する', @task, method: :delete, data: { confirm: '本当に削除してよろしいですか?' } %>

app/vies/tasks/<h1>タスク新規作成ページ</h1>

<%= render 'form', task: @task %>

<%= link_to '一覧に戻る', tasks_path %>

*app/viesw/tasks/edit.html.erb*

<h1>id: <%= @task.id %> のタスク編集ページ</h1>

<%= render 'form', task: @task %>
<%= link_to '一覧に戻る', tasks_path %>

*app/views/users/new.html.erb*

<div class="text-center">
<h1>Sign up</h1>
</div>

<div class="row">
<div class="col-sm-6 offset-sm-3">

<%= form_with(model: @user, local: true) do |f| %>
<%= render 'layouts/error_messages', model: f.object %>

<div class="form-group">
<%= f.label :name, 'Name' %>
<%= f.text_field :name, class: 'form-control' %>
</div>

<div class="form-group">
<%= f.label :email, 'Email' %>
<%= f.email_field :email, class: 'form-control' %>
</div>

<div class="form-group">
<%= f.label :password, 'Password' %>
<%= f.password_field :password, class: 'form-control' %>
</div>

<div class="form-group">
<%= f.label :password_confirmation, 'Confirmation' %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
</div>

<%= f.submit 'Sign up', class: 'btn btn-primary btn-block' %>
<% end %>
</div>
</div>

試したこと

エラー内容試して一週間ずっとログイン認証ができず嵌っています。
ルビー初学生なのですが、もう自分が何してるのか何がわかっていて何がわからないかもわかりません( ;  ; )
底辺な質問と言い訳してごめんなさい。批判中傷受け付けてません。心の優しい回答者さまを募集指定ます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

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