如何在Rails 5视图中显示Merit Gem徽章的授予日期?
解答:Rails 5视图中显示Merit徽章及授予时间(granted_at)
嘿,先给你明确说:完全不需要启用MeritObserver,这个需求有更直接简便的解决方案,核心问题是你原来的遍历方式没找对存储granted_at的位置。
问题根源
Merit gem里,granted_at这个字段并不存在于Badge模型本身,而是存储在badges_sashes这个中间关联表中——它是连接用户(你的Profil模型)和徽章的桥梁,用来记录「哪个用户在什么时候获得了哪个徽章」。你之前直接遍历@profil.badges,拿到的只是Badge对象,自然拿不到授予时间。
简便解决方案
直接通过Profil的sash关联,遍历badges_sashes集合,这里面的每个元素同时包含对应的Badge对象和granted_at字段:
<% @profil.sash.badges_sashes.each do |badge_sash| %> <div class="badge-container"> <%# 渲染徽章图片 %> <%= image_tag badge_sash.badge.custom_fields[:image], alt: badge_sash.badge.name, class: "badge-image" %> <%# 渲染授予时间,可根据需求调整日期格式 %> <p class="granted-time">授予于: <%= l badge_sash.granted_at, format: :short %></p> </div> <% end %>
额外注意事项
确保你的Profil模型已经正确引入Merit的关联宏,这样才能自动生成sash关联:
# app/models/profil.rb class Profil < ApplicationRecord has_merit # 这个宏会自动添加sash关联,以及和徽章的关联逻辑 end
关于MeritObserver
Observer主要是用来在授予徽章的动作发生时执行额外逻辑(比如发送通知、记录日志),和视图里显示已有徽章的授予时间完全无关,所以完全不需要启用它来满足当前需求。
内容的提问来源于stack exchange,提问作者Gregdebrick
相关产品推荐
相关产品推荐

