Ruby on Rails入门:Rails for Zombies中check_ammo的@user来源问题
关于Weapon模型check_ammo方法中@user的来源分析
嘿,针对你问的Rails for Zombies里Weapon模型check_ammo方法中@user的来源,我结合这个教程里的典型代码结构给你拆解下:
模型关联是最核心的来源
在这个教程的场景里,Weapon和User肯定是有关联的,你去看schema.rb的话,weapons表大概率有个user_id字段,对应users表的主键。而Weapon模型里会声明belongs_to :user的关联关系。这种情况下,
check_ammo里的@user通常是从关联属性获取的,比如模型代码可能是这样:class Weapon < ApplicationRecord belongs_to :user def check_ammo # 用@user缓存关联的user对象,避免重复查询 @user ||= self.user # 接下来就是弹药检查的逻辑,比如判断@user的弹药储备之类的 end这里的
self.user就是通过关联关系从数据库里查到的和当前Weapon绑定的User对象,赋值给@user是为了后续方法里复用,不用每次都查数据库。控制器上下文传递的情况
有时候控制器会在调用模型方法前,把当前用户(比如登录的current_user)赋值给Weapon实例的@user变量。比如控制器代码可能是:def check_weapon_ammo @weapon = Weapon.find(params[:id]) # 直接给Weapon实例设置@user变量 @weapon.instance_variable_set(:@user, current_user) @weapon.check_ammo end不过这种方式在Rails里不算规范写法,更多还是用模型关联来处理。
邮件器上下文的特殊场景
如果check_ammo是在邮件器里被调用的,那@user可能是邮件器动作里定义的实例变量。比如邮件器代码:class WeaponMailer < ApplicationMailer def low_ammo_warning(user, weapon) @user = user @weapon = weapon # 在邮件器的上下文中调用check_ammo,这时候@user是邮件器里的实例变量 @weapon.check_ammo mail(to: @user.email, subject: "你的武器弹药不足啦!") end这种情况下,邮件器的上下文会把
@user传递给Weapon的方法使用。
总的来说,模型关联获取是最常见的情况,你去看Weapon模型的代码,肯定能找到belongs_to :user的声明,而schema.rb里的weapons表也会有user_id字段来支撑这个关联。
内容的提问来源于stack exchange,提问作者user9675688
相关产品推荐
相关产品推荐

