繁体   English   中英

我怎么能干这个代码?

[英]How can I DRY this code?

这是一个Ruby代码:

  if (@user.isAdmin?)
    @admin_profile         = AdminProfile.new 
    @user.admin_profile    = @admin_profile 
    @admin_profile.save
    @user.admin_profile_id = @admin_profile.id 
  else        
    @personal_profile = PersonalProfile.new
    @user.personal_profile = @personal_profile
    @personal_profile.save
    @user.personal_profile_id = @personal_profile.id
  end                

是否可以干掉这段代码? 两个代码非常相似,但正如您所看到的,它们有一些区别,是否可以使其更简单?

作为第一步,无论配置文件类型如何,您都可以使用相同的变量

@profile = @user.isAdmin? ? AdminProfile.new : PersonalProfile.new

这是使用具有形式条件的 Ruby的条件运算符 值为true如果为false 则为 value 即如果@user.isAdmin? 评估为true然后@profile获取后的值? 如果@user.isAdmin? 是假的,然后@profile获取@profile的值: 请注意,因为您的方法名称已经以?结尾? 你得到这个双重外观?

然后

if (@user.isAdmin?)
  @user.admin_profile = @profile 
  @user.admin_profile_id = @profile.id 
else        
  @user.personal_profile = @profile
  @user.personal_profile_id = @profile.id
end 

此外,不确定这是否是Rails代码,但如果是,那么您不需要设置admin_profileadmin_profile_id ,实际上@profile.id将不会被设置,因为配置文件尚未保存。 所以你可以将if/else减少到:

if (@user.isAdmin?)
  @user.admin_profile = @profile 
else        
  @user.personal_profile = @profile
end 

更新

您还应该查看使用belongs_to关联时获得的create_association方法。 您可以让Rails在一个步骤中创建并保存关联的对象,例如

@user.create_personal_profile

怎么样才能减少if else

@ user.isAdmin? @ user.admin_profile = @profile:@ user.personal_profile = @profile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM