2010-03-01 70 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