🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Devise

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

Ruby

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

Q&A

解決済

2回答

1609閲覧

テキスト投稿者とログインユーザーのidが一致した場合の表示制限機能に関する質問

t.ippai

総合スコア0

Devise

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

Ruby

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

0グッド

0クリップ

投稿2021/01/14 13:54

編集2021/01/16 09:31

前提・実現したいこと

◎前提(システム概要)
簡単な日記を記述するシステムを構築しています。
アクセスをすると投稿した日記の一覧を表示出来るようにしており、一覧で表示した際に、削除・編集・個別表示が出来るようリンクを設定しています。

gemのdeviseを導入してユーザーの登録を出来るように設定。
アソシエーションによって,日記のデータベーステーブルとユーザーのテーブルを関連付けしています。

◎実現したいこと。
ユーザーがログインをした際に、投稿した日記のユーザーidとログインしているユーザーidが
一致している場合のみ、削除・編集・個別表示のリンクが表示されるように設定したいです。

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

ログイン中のユーザーと日記のユーザーidが一致した時のみ表示がされるよう記述を行なったのですが表示されません。
deviseからidを取得する場合には何か注意しなければいけない事があるのでしょうか。
ご助力をお願い致します。

該当のソースコード

controllerの記述

ruby

1 2 3 def index 4 @diaries = Diary.all.order("created_at DESC") 5 end

Diraymodelの記述

ruby

1class Diary < ApplicationRecord 2 validates :d_text, presence: true 3 validates :d_weath, presence: true 4 validates :d_feel, presence: true 5 belongs_to :user 6end

Usermodelの記述

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 has_many :diaries 7end

index.html.erbの記述

ruby

1 2<div class="contents"> 3<% @diaries.each do |diary| %> 4 <div class="d_content"> 5 <div class="one_content"> 6 <%# 日記のテキスト表示 %> 7 <span class="text_content"> 8 <p class="text"> <%= diary.d_text %> </p> 9 <div class = "info_content"> 10 <%# 天気の情報を表示 %> 11 <span class="weath_content"> 12 <%= diary.d_weath %> 13 </span> 14 <%# 気分の情報を表示 %> 15 <span class="feel_content"> 16 <%= diary.d_feel %> 17 </span> 18 <%# 投稿時間の情報を表示 %> 19 <span class="create_date"> 20 <%= diary.created_at %> 21 </div> 22 <tr> 23 24      ココから下が該当記述。 25 26      <% if user_signed_in? && current_user.id == diary.user_id %> 27 <td><%= link_to 'Delete(削除)',"/diaries/#{diary.id}",method: :delete , data: { confirm: '削除してよいですか?' } %> </td> 28 <td><%= link_to 'edit(編集)',"/diaries/#{diary.id}/edit",method: :get , data: { confirm: '編集してよいですか?' } %> </td> 29 <% end %> 30      <%= "テストスペース" "#{user_signed_in? && current_user.id}#{diary.user_id}" %> 31 32 33      <td><%= link_to '個別表示',"/diaries/#{diary.id}",method: :get %> </td> 34 </tr> 35 </span> 36 </div> 37 </div> 38 <% end %> 39</div>

イメージ説明
イメージ説明

試したこと

current_user.id と diary.user_id がデータベースから取得できていないのではないかと考え。
それぞれのIDを表示する記述を行なった。
※ 上記index.html.erbのテストスペースが該当。
するとそれぞれのidはきちんと表示されて、idの取得はできている事が分かった。
また表示されたidが一致した場合でも記述が機能していないことが判明。

追加で試した事

index.htmlの記述をdiary.user_idではなく、diary.idとした場合には、期待通りの表示になります。
しかし、アソシエーションによって関連付けた、ユーザーテーブルのuser.idで制限を行いたいのでこのままでは意味がありません。

ruby

1<table> 2<%= "テストスペース" "#{user_signed_in? && current_user.id}#{diary.id}" %> 3<% if user_signed_in? && current_user.id == diary.id %> 4<%= link_to 'Delete(削除)',"/diaries/#{diary.id}",method: :delete , data: { confirm: '削除してよいですか?' } %> 5<%= link_to 'edit(編集)',"/diaries/#{diary.id}/edit",method: :get , data: { confirm: '編集してよいですか?' } %> 6<% end %> 7<%= link_to '個別表示',"/diaries/#{diary.id}",method: :get %> 8</table>

イメージ説明
イメージ説明

user.idを表示するのは問題ないので、取得はできているが条件に活用すると認識されていない状態なので
アソシエーションに問題があるのかもしれないと考えています。

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

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

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

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

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

guest

回答2

0

<tr> たちを <table> </table>
で囲んでみてください。

投稿2021/01/16 08:23

winterboum

総合スコア23567

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

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

t.ippai

2021/01/16 09:33 編集

ご回答頂き本当にありがとうございます。 ご指摘いただいた箇所を以下のように変更してみたのですが、表示は変わりませんでした。 頂いた回答を反映して、さらに追加で実行したみたことも追記しております。 ご助力頂けますと幸いです。 ```Ruby <table> <%= "テストスペース" "#{user_signed_in? && current_user.id}・#{diary.user_id}" %> <% if user_signed_in? && current_user.id == diary.user_id %> <%= link_to 'Delete(削除)',"/diaries/#{diary.id}",method: :delete , data: { confirm: '削除してよいですか?' } %> <%= link_to 'edit(編集)',"/diaries/#{diary.id}/edit",method: :get , data: { confirm: '編集してよいですか?' } %> <% end %> <%= link_to '個別表示',"/diaries/#{diary.id}",method: :get %> </table> ```
winterboum

2021/01/16 11:05

table の書き方が目ちゃめヂャです。 tableで囲め、としたのは tr があるから。 table使うのか使わないのか統一して書きなおしてください
t.ippai

2021/01/16 12:45

申し訳ありません失礼致しました。 <table>と<tr>を使用してもう一度書き直してみました。 結果としては、削除・編集リンク共に表示されませんでした。 ```ruby <table> <tr> <% if user_signed_in? && current_user.id == diary.user_id %> <td><%= link_to 'Delete(削除)',"/diaries/#{diary.id}",method: :delete , data: { confirm: '削除してよいですか?' } %> </td> <td><%= link_to 'edit(編集)',"/diaries/#{diary.id}/edit",method: :get , data: { confirm: '編集してよいですか?' } %> </td> <% end %> <td><%= link_to '個別表示',"/diaries/#{diary.id}",method: :get %> </td> </tr> </table> ```
winterboum

2021/01/16 13:45

画像の一番下にある 編集、削除のlinkはどのcodeでのものですか
guest

0

自己解決

uesr idの記述を以下のように変更したら。
正しく表示されました。
間違った記述でも、表示はされるのでなぜ、制限をかける際に使用すると認識されなかったのか不明ですが一旦は解決できました。

変更前

ruby

1<% if user_signed_in? && current_user.id == diary.user_id %>

変更後

ruby

1<% if user_signed_in? && current_user.id == diary.user.id %>

投稿2021/01/17 20:51

t.ippai

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問