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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1498閲覧

ログインした本人のみしかページを見れなくしたいです。

jun3030

総合スコア16

Ruby

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

Ruby on Rails

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

1グッド

2クリップ

投稿2019/09/28 17:01

前提・実現したいこと

数日間悩んでいるので質問させて頂きます汗

ログインしている本人しかページを見れなくしたいです。
具体的には、before_action :correct_user, only: [:new, :index, :show]でnew,index,showページを制限したいです。new, indexは上手く制限できているのですが,showページが本人なのに制限されてしまいます。
エラーは出ないのですが、アクセスしたユーザーがログイン中のユーザーか確認するメソッドのcorrect_userに引っかかり、本人なのに閲覧できません。

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

class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
include SessionsHelper

#本人かどうか確認します
def correct_user
redirect_to(root_url) unless current_user?(@user)
end

def set_user
@user = User.find(params[:id])
end

def set_task
@task = Task.find(params[:id])
end

class TasksController < ApplicationController

before_action :set_user, only: [:new, :index]
before_action :set_task, only: [:edit, :update, :destroy]
before_action :set_current_user, only: [:show]
before_action :logged_in_user, only: [:new, :show, :edit, :index]
before_action :correct_user, only: [:new, :index, :show]

def new
@task = Task.new
end

def create
@task = Task.new(user_id: @current_user.id, tasks_name: task_params[:tasks_name], contents: task_params[:contents])
if @task.save
flash[:success] = "新規作成に成功しました。"
redirect_to tasks_index_url(@task)
else
render :new
end
end

def index
@tasks = Task.where(user_id: @current_user.id).order("created_at DESC").paginate(page: params[:page], per_page: 5)
end

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

module SessionsHelper

一時的セッションにいるユーザーを返します。

それ以外の場合はcookiesに対応するユーザーを返します。

def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end

渡されたユーザーがログイン済みのユーザーであればtrueを返します。

def current_user?(user)
user == current_user
end

ルーティング

refix Verb URI Pattern Controller#Action
root GET / static_pages#top
signup GET /signup(.:format) users#new
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
tasks GET /users/:id/tasks(.:format) tasks#index
POST /users/:id/tasks(.:format) tasks#create
new_task GET /users/:id/tasks/new(.:format) tasks#new
edit_task GET /users/:id/tasks/:id/edit(.:format) tasks#edit
task PATCH /users/:id/tasks/:id(.:format) tasks#update
PUT /users/:id/tasks/:id(.:format) tasks#update
DELETE /users/:id/tasks/:id(.:format) tasks#destroy
user_tasks_show GET /users/:user_id/tasks/:id(.:format) tasks#show
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy

試したこと

tasks#new, tasks#indexは上手く出来ているので,tasks#showのurlの設定の仕方を同じにしてみましたが上手く行きませんでした汗

忙しいと思いますがどうかご教授お願い致します。汗

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

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

DrqYuto👍を押しています

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

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

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

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

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

gouf

2019/09/28 20:02 編集

質問が重複しているようです: * [Ruby - 本人のみしかページを見れなくしたいです。|teratail](https://teratail.com/questions/214312 ) * [Ruby - ログインしている本人しかページを見れなくしたい。|teratail](https://teratail.com/questions/214311 ) 旧いものについては削除依頼を出し、情報の分散を抑えるようにしてください
jun3030

2019/09/29 13:48

他の質問者様の邪魔になってしまい申し訳ありません。 削除の仕方が解らずそのままとなっていました、、 わざわざ回答下さりありがとうございます!
guest

回答1

0

ベストアンサー

質問の修正ができるので、あたらしく追加するのは止めましょう!

before_action :correct_user, only: [:new, :index, :show]

ですから、showはまだ実行されていないので、@user は nil なので失敗します

def correct_user
redirect_to(root_url) unless current_user?(current_user)
end

## 追記
すみません嘘書きました
これだと常に通ってしまいます。

redirect_to(root_url) unless current_user.id == params[:id]

かなぁ、、
よく見ると、index、newにも correct_user してますが、これは必ず失敗しますね。
ということは show だけにあればよいということになりますから before_actionは止めて、show の中に書く方が良いように思われます。

def show
@user = User.find(params[:user_id])
redirect_to(root_url) unless current_user?(@user)
@task = Task.find(params[:id])
end

投稿2019/09/28 21:58

編集2019/09/29 03:07
winterboum

総合スコア23284

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

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

jun3030

2019/09/29 13:52

忙しい中わざわざありがとうございます! 質問の削除の仕方などが解らずそのままとなっていました。 申し訳ありません、、 ルーティングの設定の仕方等、viewファイルの方にも問題があったようです。お陰で解決する事ができました! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問