Merit在Devise创建第二个Member账号后失效问题及解决
Merit + Devise 自定义Member模型注册时规则失效的问题排查与解决
问题场景
我在使用Merit配合Devise实现会员注册徽章奖励功能时,遇到了一个棘手的问题:
- 第一个Member账号注册时,能正常触发Merit规则获取
WelcomeIn徽章,服务器日志显示更新正常 - 注销后创建第二个测试Member时,账号虽然能成功创建,但服务器日志出现
ROLLBACK,且该Member无法触发任何Merit规则,而第一个Member的Merit功能依然正常
日志对比
正常运行日志(第一个用户注册)
SQL (0.5ms) UPDATE "members" SET "sash_id" = $1, "updated_at" = $2 WHERE "members"."id" = $3 [["sash_id", 1], ["updated_at", "2018-05-19 17:15:30.716358"], ["id", 3]]
异常运行日志(第二个用户注册)
(0.1ms) ROLLBACK
原注册控制器代码
当时我的Devise注册控制器代码如下:
class Members::RegistrationsController < Devise::RegistrationsController # POST /resource def create @user = build_resource # Needed for Merit super if @member.persisted? MemberMailer.send_welcome(@member).deliver_now Notification.create!(category: "welcome", member: @member, topic: "Bienvenue sur MonApp !", checked: false) end end end
问题根源与解决方案
经过排查发现,问题出在Devise模型不是默认的User而是自定义的Member,Merit在触发规则时无法正确识别对应的模型实例。只需要在控制器中添加一行代码,将@user赋值给@member即可解决问题:
修改后的注册控制器代码:
class Members::RegistrationsController < Devise::RegistrationsController # POST /resource def create @user = build_resource # Needed for Merit @member = @user super end end
感谢@TuteC的帮助!
内容的提问来源于stack exchange,提问作者Gregdebrick
相关产品推荐
相关产品推荐

