2010-03-01 135 views
0

我需要編寫一個方法,返回布爾值是否設置爲true/false。rails,方法,我需要幫助

在我的情況下,布爾值是產品的屬性。而跳過在結賬過程中的一步,我需要有這種類似以下自方法工作:

def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.user 
end 

這個例子是從application_controller,並且是做在結賬過程中,同樣的事情,我需要在這裏做。

這一次我有工作的使用方法是:

def checkout_steps              
    checkout_steps = %w{registration billing shipping shipping_method payment confirmation} 
    checkout_steps.delete "registration" if current_user 
    checkout_steps 
end 

我需要工作與上面相同的刪除項的布爾值。我正試圖學習如何工作,所以任何解釋都非常感謝。

想法?

回答

0

我不太確定我按照你的問題,但如果你問這條線是如何工作的:

checkout_steps.delete "registration" if current_user 

這不是current_user返回它的值是在做它的方式。這是一個內置的Ruby的語法,你可以指定一個行,如果以下形式的語句:

<statment> if <condition> # only execute <statement> if <condition> is true 

,而不是更傳統的方式:

if <condition> then 
    <statement> 
end 

如將在本全,如果/結束語法,如果條件爲真,Ruby將只評估語句,條件可以是通常放置在if條件中的任何代碼。

在你的情況,如果產品的屬性是一樣的東西can_be_shipped,指示項目是否可以發貨,你可以簡單地做

checkout_steps.delete 'shipping' if [email protected]_be_shipped 

Rails的支持另一種語法測試條件是否計算爲false:

<statment> unless <condition> # only execute <statement> if <condition> is false 

這可能是用來製造邏輯更加清晰:

checkout_steps.delete 'shipping' unless @product.can_be_shipped 
+0

更可讀性會是'checkout_steps.delete'shipping',除非@ product.can_be_shipped'。 – 2010-03-01 21:46:39

+0

我想你們都走在正確的軌道上,非常感謝您的幫助。在這個問題上長時間工作(時間停止成爲一個新手)。在這種情況下,我在產品上有促銷屬性。如果促銷布爾值被選中,我不想收取運費,因此取消了運送步驟。 做你寫的東西; checkout_steps.delete「shipping_method」if [email protected]在促銷時返回無方法錯誤。這就是我認爲從application_controller方法拉出來以便它可以在任何地方可用的原因。任何其他的想法? – 2010-03-01 21:56:45

+0

您的意思是「if!@ product.promotions',複數? – meagar 2010-03-01 22:13:42

0

試試這個:

def current_user 
    current_user_session.user if current_user_session 
end 

def signed_in? 
    current_user_session && !current_user_session.user.nil? 
end 

然後我會重寫你的check_steps是:

checkout_steps.delete "registration" if signed_in? 

我希望這有助於!

+0

感謝您的信息,如果該部分被破壞,但它可以正常工作,這將完全有所幫助。我試圖創建一個類似的方法,檢查產品模型的布爾「促銷」,如果促銷是真實的,它將最終跳過一個送貨步驟。 感謝之手 – 2010-03-01 21:58:17