我怎么能干这个代码?

时间:2010-07-12 07:15:45

标签: ruby-on-rails ruby

这是一个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                

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

2 个答案:

答案 0 :(得分:5)

作为第一步,您可以使用相同的变量,无论简档类型如何。

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

这是使用具有条件形式的Ruby conditional operator value if true value if false 。即如果@user.isAdmin?评估为true,则@profile获取?之后的值。如果@user.isAdmin?为false,则@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

答案 1 :(得分:1)

如果要减少if else

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