前提・実現したいこと
◎前提(システム概要)
簡単な日記を記述するシステムを構築しています。
アクセスをすると投稿した日記の一覧を表示出来るようにしており、一覧で表示した際に、削除・編集・個別表示が出来るようリンクを設定しています。
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を表示するのは問題ないので、取得はできているが条件に活用すると認識されていない状態なので
アソシエーションに問題があるのかもしれないと考えています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/16 09:33 編集
2021/01/16 11:05
2021/01/16 12:45
2021/01/16 13:45