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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

Q&A

解決済

2回答

1699閲覧

Railsでログインはできているのにユーザー詳細のviewに指定したcurrent_userがnilになりエラーになってしまう

kei13

総合スコア0

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/28 16:12

前提・実現したいこと

rails6で掲示板サイトを作っています。
ログインしているユーザーだけが編集できるようにしていて、編集ページまでいくことは可能なのですが、更新ボタンを押すと下のエラーが発生してしまいます。
エラーの後にホームのページに戻ると再度ログインしないといけないようになっているのですが、ログインしなおしてユーザーの情報を見ると変更はされています。
ちなみに、ログインしているユーザーは投稿の編集や自分のコメントの削除はできる状態です。
ユーザーの編集を行った時だけ下のエラーが出ます。
分かる方教えていただけると助かります。よろしくお願いします。

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

イメージ説明

コード

routing

1 devise_for :users 2 # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html 3 root to: "homes#index" 4 resources :users 5 resources :posts do 6 resources :comments, only: [:create, :destroy] 7 resources :likes, only: [:create, :destroy] 8 end

usermodel

1 devise :database_authenticatable, :registerable, 2 :recoverable, :rememberable, :validatable 3 4 attachment :profile_image 5 has_many :posts, dependent: :destroy 6 has_many :comments, dependent: :destroy 7 has_many :commented_posts, through: :comments, source: :post 8 has_many :likes, dependent: :destroy 9 has_many :liked_posts, through: :likes, source: :post 10 11 def posts 12 return Post.where(user_id: self.id) 13 end 14 15 def alread_liked?(post) 16 self.likes.exists?(post_id: post.id) 17 end

userscontroller

1 def index 2 @users = User.all 3 end 4 5 def show 6 @user = User.find(params[:id]) 7 end 8 9 def edit 10 @user = User.find(params[:id]) 11 end 12 13 def update 14 @user = User.find(params[:id]) 15 @user.update(user_params) 16 redirect_to user_path(@user) 17 end 18 19 private 20 def user_params 21 params.require(:user).permit(:username, :student_id, :email, :password, :profile_image, :profile) 22 end

usershowview

1 <% if @user.id == current_user.id %> 2 <div class="loginuser-only"> 3 <%= link_to '編集',edit_user_path(@user), class: 'loginuser-only-btn' %> 4 </div> 5 <% end %>

editview

1 <%= form_with model: @user do |f| %> 2 3 <div class="edit-field"> 4 <%= f.label :username,'ユーザー名', class: 'user-edit-label'%> 5 <%= f.text_field :username, class: 'user-edit-field' %> 6 </div> 7 8 <div class="edit-field"> 9 <%= f.label :student_id,'学籍番号', class: 'user-edit-label'%> 10 <%= f.text_field :student_id, class: 'user-edit-field' %> 11 </div> 12 13 <div class="edit-field"> 14 <%= f.label :email, class: 'user-edit-label'%> 15 <%= f.email_field :email, class: 'user-edit-field' %> 16 </div> 17 18 <div class="edit-field"> 19 <%= f.label :password, class: 'user-edit-label'%> 20 <%= f.password_field :password, class: 'user-edit-field' %> 21 </div> 22 23 <div class="edit-field"> 24 <%= f.label :profile,'プロフィール', class: 'user-edit-label'%> 25 <%= f.text_area :profile, class: 'user-edit-field user-edit-area', rows: 10 %> 26 </div> 27 28 <div class="edit-field"> 29 <%= f.label :profile_image,'プロフィール画像', class: 'user-edit-label'%> 30 <%= f.attachment_field :profile_image, class: 'user-edit-field' %> 31 </div> 32 33 <div class="user-edit-submit-container"> 34 <%= f.submit '更新', class: 'user-edit-submit'%> 35 </div> 36 37 <% end %>

postcontroller

1 def index 2 @posts = Post.all 3 end 4 5 def show 6 @post = Post.find(params[:id]) 7 @comments = @post.comments 8 @comment = Comment.new 9 @like = Like.new 10 end 11 12 def new 13 @post = Post.new 14 end 15 16 def create 17 @post = Post.new(post_params) 18 @post.user_id = current_user.id 19 @post.save 20 redirect_to post_path(@post) 21 end 22 23 def edit 24 @post = Post.find(params[:id]) 25 end 26 27 def update 28 @post = Post.find(params[:id]) 29 @post.update(post_params) 30 redirect_to post_path(@post) 31 end 32 33 def destroy 34 @post = Post.find(params[:id]) 35 @post.destroy 36 redirect_to posts_path 37 end 38 39 private 40 def post_params 41 params.require(:post).permit(:title, :body, :image) 42 end

postshowview

1 <% if @post.user.id == current_user.id %> 2 <div class="post-show-edit-destroy"> 3 <%= link_to '編集する',edit_post_path(@post), class: 'post-show-btn' %> 4 <%= link_to '削除する',post_path(@post), method: :delete, data: {confirm: 'この投稿を削除しますか?'}, class: 'post-show-btn' %> 5 </div> 6 <% end %>

試したこと

ログイン後にログインしている人しか見れないページに飛んでいるのをチェックし、ログインできているか確認した
userscontrollerにbefore_action :authenticate_user!をつけてみたが、更新を押すとエラーは出ないがログイン画面に遷移される

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

rails 6.0.3.4
ruby 2.6.6
gem devise
docker

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

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

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

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

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

guest

回答2

0

自己解決

原因
deviseのユーザー編集のviewを使用しておらず、別で編集ページを作ってしまっており、そこにパスを通していた

解決策
deviseのユーザー編集へのviewのパスに変えたらうまくいった

投稿2020/10/29 08:09

kei13

総合スコア0

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

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

0

Users#showで、現在ログインしているユーザーを表示したければ下記のようになるかと思います。

Ruby

1def show 2 - @user = User.find(params[:id]) 3 + @user = current_user 4end 5

投稿2020/10/29 01:24

no1knows

総合スコア3365

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

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

kei13

2020/10/29 02:01

回答ありがとうございます。 自分の説明不足で申し訳ございません 上記のことを試すと他のユーザーの詳細画面にいった際に現在のログインしているユーザーの情報がしまうようになってしまいます
no1knows

2020/10/29 02:47

日本語をきちんと理解できていないので確認ですが、自分の情報を更新しようと更新ボタンを押すとエラーがでるということでしょうか?
kei13

2020/10/29 08:04

はい!その通りです! 原因はdeviseのeditのviewを使用しておらず別でユーザーの編集ページを作ってしまっておりそのページにパスを通していたことでした。 回答いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問