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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

2149閲覧

【devise】他のユーザー情報の開示その2(プロフィールがcurrent_userで上書き)

退会済みユーザー

退会済みユーザー

総合スコア0

Devise

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/06 20:25

前提・実現したいこと

簡単な画像投稿アプリを作成中です。
ユーザーの管理はdeviseで、プロフィールページは作りました。
で、投稿者の名前を押下すると、投稿した人のプロフィールページに遷移するようにしたいのですが、
恐らくusersコントローラーの@user = current_userが原因で、ログインユーザーのページに遷移します。
(パラメータは投稿した人のidなのですがshowアクションを経由したらcurrent_userで上書きになります)

※以下の書き込みと状況はほとんど同じなのですが、申し訳ありません、お力添えいただけたら幸甚です。
https://teratail.com/questions/25249

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

パラメータは投稿した人のidですがshowアクションを経由したらcurrent_userで上書きになる。
※例えば、user_id=1の人が、user_id=2の人の名前を押下したら、
pathはusers/2ですが画面の表示はusers/1のプロフィールになる。

該当のソースコード

コントローラー

Rails

1class UsersController < ApplicationController 2 def show 3 @user = current_user 4 end 5 def favorites 6 @user = current_user 7 @favorites = Favorite.where(user_id: @user.id).all 8 end 9end

詳細画面のlink_to @stroll.user.nameを押下したら投稿した人のプロフィールページに遷移したい。

Rails

1<h1>詳細画面</h1> 2<%= image_tag @stroll.image.url %> 3<p><%= link_to @stroll.user.name, "/users/#{@stroll.user_id}" %></p> 4<p><%= @stroll.title %></p> 5<p><%= @stroll.content %></p> 6<% if current_user %> 7 <% unless @stroll.user_id == current_user.id %> 8 <% if @favorite.present? %> 9 <%= link_to 'お気に入りを解除する', favorite_path(id: @favorite.id), method: :delete, class: 'btn btn-danger' %> 10 <% else %> 11 <%= link_to 'お気に入りに登録する', favorites_path(stroll_id: @stroll.id), method: :post, class: 'btn btn-primary' %> 12 <% end %> 13 <% end %> 14<% end %> 15<%= link_to "一覧画面にもどる", strolls_path %>

プロフィールページ

Rails

1<h1><%= @user.name %>のページ</h1> 2<%= image_tag @user.profile_image.url if @user.profile_image && @user.profile_image.url%> 3<p><%= @user.profile %></p> 4<p><%= @user.name %></p> 5<p><%= @user.email %></p> 6 7<%= link_to 'プロフィール編集', edit_user_registration_path(@user) %> 8<%= link_to 'お気に入り一覧', favorites_user_path(@user.id) %> 9<%= link_to '一覧', strolls_path %>

試したこと

Usersコントローラーを少し書き直したところ、投稿者のプロフィールページにアクセスできました。
ただ、今度は自分のプロフィールページ(users_show_path)にアクセスしたらエラーになります。

Rails

1class UsersController < ApplicationController 2 before_action :set_user, only: %i(show) 3 def show 4 @strolls = @user.strolls 5 end 6 def favorites 7 @user = current_user 8 @favorites = Favorite.where(user_id: @user.id).all 9 end 10 private 11 def set_user 12 @user = User.find(params[:id]) 13 end 14end

エラーメッセージ

ActiveRecord::RecordNotFound in UsersController#show Couldn't find User without an ID private def set_user @user = User.find(params[:id]) end end

https://teratail.com/questions/25249のとおりshowアクションだけコントローラーを直したところ、

Rails

1class UsersController < ApplicationController 2 def show 3 @user = User.find(params[:user_id]) 4 end 5 def favorites 6 @user = current_user 7 @favorites = Favorite.where(user_id: @user.id).all 8 end 9end

投稿者のプロフィールページにも自分のプロフィールページにもアクセスできませんでした(同じエラー)。

Rails

1ActiveRecord::RecordNotFound in UsersController#show 2Couldn't find User without an ID 3 4class UsersController < ApplicationController 5 def show 6 @user = User.find(params[:user_id]) 7 end 8 def favorites 9 @user = current_user

長文恐れ入りますが、何卒よろしくお願いいたします。

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

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

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

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

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

maisumakun

2020/04/07 00:21

ルーティングはどのようになっていますか?
退会済みユーザー

退会済みユーザー

2020/04/07 03:50 編集

本当にありがとうございます。teratail初めてです。回答を頂戴でき感謝感謝です。 恐れ入りますがルーティングを貼り付けます。何卒よろしくお願い申し上げます。 > > Prefix Verb URI Pattern >Controller#Action > new_user_session GET /users/sign_in(.:format) >devise/sessions#new > user_session POST /users/sign_in(.:format) >devise/sessions#create > destroy_user_session DELETE /users/sign_out(.:format) >devise/sessions#destroy > new_user_password GET /users/password/new(.:format) >devise/passwords#new > edit_user_password GET /users/password/edit(.:format) >devise/passwords#edit > user_password PATCH /users/password(.:format) >devise/passwords#update > PUT /users/password(.:format) >devise/passwords#update > POST /users/password(.:format) >devise/passwords#create > cancel_user_registration GET /users/cancel(.:format) >users/registrations#cancel > new_user_registration GET /users/sign_up(.:format) >users/registrations#new > edit_user_registration GET /users/edit(.:format) >users/registrations#edit > user_registration PATCH /users(.:format) >users/registrations#update > PUT /users(.:format) >users/registrations#update > DELETE /users(.:format) >users/registrations#destroy > POST /users(.:format) >users/registrations#create > users_show GET /users/show(.:format) >users#show > root GET / >strolls#chiba > strolls_ganbarou GET /strolls/ganbarou(.:format) >strolls#ganbarou > strolls_people GET /strolls/people(.:format) >strolls#people > strolls GET /strolls(.:format) >strolls#index > POST /strolls(.:format) >strolls#create > new_stroll GET /strolls/new(.:format) >strolls#new > edit_stroll GET /strolls/:id/edit(.:format) >strolls#edit > stroll GET /strolls/:id(.:format) >strolls#show > PATCH /strolls/:id(.:format) >strolls#update > PUT /strolls/:id(.:format) >strolls#update > DELETE /strolls/:id(.:format) >strolls#destroy > favorites POST /favorites(.:format) >favorites#create > favorite DELETE /favorites/:id(.:format) >favorites#destroy > favorites_user GET /users/:id/favorites(.:format) >users#favorites > users 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 > letter_opener_web /letter_opener >LetterOpenerWeb::Engine > rails_service_blob GET /rails/active_storage/blobs/:signed_id/*filename(.:format) >active_storage/blobs#show >rails_blob_representation GET >/rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) >active_storage/representations#show > rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) >active_storage/disk#show >update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) >active_storage/disk#update > rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) >active_storage/direct_uploads#create >
guest

回答1

0

ベストアンサー

まず根本的なところとして、users/showのような1つのアクションは、「(自分に限らない)あるユーザーの情報を表示」か「自分の情報を表示」か、どちらかだけの機能にしてください。

両方を共用することもできなくはないかもしれませんが、いたずらに煩雑になるだけでメリットはありません。

投稿2020/04/07 00:20

maisumakun

総合スコア146018

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

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

maisumakun

2020/04/07 00:26

「どちらも機能的には同じでいい」という状況であれば、「自分の情報を表示」のアクションを「あるユーザーの情報を表示(IDは自分のもの)」にリダイレクトさせることで済ませるのもありです。
退会済みユーザー

退会済みユーザー

2020/04/07 03:57

ありがとうございます。恐れ入ります。本当に初歩的なところで恐縮ですが、 いま自分のshowアクションは@user=current_userなので、「自分の情報を表示」の意味ですが、 実現したいことは「(自分に限らない)ユーザーの情報を表示」なので、「どちらかだけの機能」に という趣旨で回答を頂戴したということでよろしいでしょうか。 ``` def show @user = current_user end ```
maisumakun

2020/04/07 04:04

質問で、「Usersコントローラーを少し書き直したところ、投稿者のプロフィールページにアクセスできました。ただ、今度は自分のプロフィールページ(users_show_path)にアクセスしたらエラーになります。」のようにやっているので、別々にアクションを作ったほうがいい、という回答です。
退会済みユーザー

退会済みユーザー

2020/04/10 13:39

遅くなり申し訳ありません。なるほど。すみません、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問