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

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

ただいまの
回答率

87.59%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 3,188

score 12

前提・実現したいこと

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

ログインしている本人しかページを見れなくしたいです。
具体的には、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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • gouf

    2019/09/29 05:01 編集

    質問が重複しているようです:

    * [Ruby - 本人のみしかページを見れなくしたいです。|teratail](https://teratail.com/questions/214312 )
    * [Ruby - ログインしている本人しかページを見れなくしたい。|teratail](https://teratail.com/questions/214311 )

    旧いものについては削除依頼を出し、情報の分散を抑えるようにしてください

    キャンセル

  • jun3030

    2019/09/29 22:48

    他の質問者様の邪魔になってしまい申し訳ありません。

    削除の仕方が解らずそのままとなっていました、、
    わざわざ回答下さりありがとうございます!

    キャンセル

回答 1

checkベストアンサー

+3

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

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/29 22:52

    忙しい中わざわざありがとうございます!

    質問の削除の仕方などが解らずそのままとなっていました。
    申し訳ありません、、

    ルーティングの設定の仕方等、viewファイルの方にも問題があったようです。お陰で解決する事ができました!
    本当にありがとうございます!

    キャンセル

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

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

関連した質問

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