You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:00:07