2010-07-12 104 views
3

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

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

+0

这是使用Rails吗? – mikej 2010-07-12 07:31:12

+0

yp,这是一个rails代码。 – Tattat 2010-07-12 07:45:23

回答

5

由于可以使用相同的变量,无论概要类型的第一步骤即

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

这是使用Ruby的conditional operator,其具有如下形式条件值如果为真如果值为假。即如果@user.isAdmin?评估为true,则@profile获得?之后的值。如果@user.isAdmin?为假,则@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 
+0

对不起,我忘了保存配置文件,顺便说一句,我想知道,什么? ?标准...我知道@ user.isAdmin ?,但下一个问号是什么意思?谢谢。 – Tattat 2010-07-12 07:46:31

+0

@Tattat - '?'是[Ruby三元运算符](http://rubylearning.com/satishtalim/simple_constructs.html):''。 – 2010-07-12 07:59:12

+0

更新了解答'?:'条件操作符的答案,并且提示也查看了'create_association'方法。 – mikej 2010-07-12 08:11:40

1

这个怎么减少,如果其他

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