2010-07-12 143 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