referred_by字段无法赋值问题求助
问题诊断与修复方案
你的推荐人信息无法写入数据库的问题,根源在于两个关键错误:
1. 推荐人查询字段错误
在注册控制器的build_resource方法中,你使用User.find_by(referred_by: cookies[:referred_by])查询推荐人,但cookies[:referred_by]存储的是推荐人的referral_code(邀请码),而非referred_by关联字段(该字段存储的是用户ID)。这个错误导致查询永远无法匹配到对应用户,自然无法设置referred_by关联。
2. 资源实例创建顺序错误
你先尝试给self.resource赋值推荐人,但随后调用resource_class.new_with_session(hash, session)重新创建了一个全新的User实例,直接覆盖了之前设置好的resource,导致推荐人信息被清空。
修复后的注册控制器代码
class Users::RegistrationsController < Devise::RegistrationsController invisible_captcha only: :create protected def build_resource(hash = {}) # 先创建用户实例,确保后续赋值不会被覆盖 self.resource = resource_class.new_with_session(hash, session) # 检查Cookie并设置推荐人 if cookies[:referred_by].present? # 使用正确的referral_code字段查询推荐人 referrer = User.find_by(referral_code: cookies[:referred_by]) self.resource.referred_by = referrer if referrer.present? end end def sign_up(resource_name, resource) sign_in(resource_name, resource) end end
验证修复效果的小技巧
可以在build_resource方法中添加日志,确认是否正确获取到推荐人:
def build_resource(hash = {}) self.resource = resource_class.new_with_session(hash, session) if cookies[:referred_by].present? referrer = User.find_by(referral_code: cookies[:referred_by]) Rails.logger.info "推荐人查询结果: #{referrer&.email || '未找到'}" self.resource.referred_by = referrer if referrer.present? end end
启动服务器后查看日志,就能直观确认推荐人是否被正确识别。
内容的提问来源于stack exchange,提问作者mwhocl
相关产品推荐
相关产品推荐

