2010-03-01 4 views
0

Je dois écrire une méthode qui retourne si oui ou non un booléen est défini sur vrai/faux.rails, méthode, j'ai besoin d'aide

Dans mon cas, le booléen est un attribut pour un produit. Et pour sauter une étape dans le processus de paiement que je dois avoir cette méthode d'auto travail similaire à ce qui suit:

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

cet exemple est de la application_controller, et est en train de faire la même chose dans le processus de paiement que je dois fais ici.

L'utilisation pour cette fois que je l'ai travail est:

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

je besoin d'un booléen qui fonctionne comme l'élément suppression ci-dessus. J'essaie d'apprendre comment cela fonctionne donc toute explication est grandement appréciée.

pensées?

Répondre

0

Je ne suis pas sûr que je suis votre question, mais si vous vous demandez comment fonctionne cette ligne:

checkout_steps.delete "registration" if current_user 

Ce n'est pas la façon dont current_user retourne sa valeur qui est le faire. Il est intégré dans la syntaxe de Ruby où vous pouvez spécifier une ligne si les déclarations sous la forme suivante:

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

au lieu de la façon plus traditionnelle:

if <condition> then 
    <statement> 
end 

Comme on le complet si/syntaxe fin , Ruby n'évaluera l'instruction que si la condition est vraie et la condition peut être n'importe quel code que vous pourriez normalement placer dans une condition if.

Dans votre cas, si quelque chose comme l'attribut du produit can_be_shipped, indiquant si l'article peut être expédié pouvez simplement faire

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

Rails prend en charge une autre syntaxe pour vérifier si la condition est fausse:

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

qui pourrait être utilisé pour rendre la logique plus claire:

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

Encore plus lisible serait 'checkout_steps.delete 'shipping' sauf si @ product.can_be_shipped'. –

+0

Je pense que vous êtes sur la bonne voie, et merci beaucoup pour votre aide. J'ai travaillé sur cette question pour longtemps (le temps d'arrêter d'être un newb).Dans ce cas, j'ai un attribut de promotions sur le produit. Si le booléen Promotions est coché, je ne veux pas facturer l'expédition, ce qui supprime l'étape d'expédition. faire ce que vous avez écrit; checkout_steps.delete "shipping_method" si! @product.promotion renvoie une erreur no method lors de la promotion. C'est la raison pour laquelle j'ai pensé qu'il serait bon de tirer d'une méthode application_controller pour qu'elle soit disponible n'importe où. D'autres pensées? –

+0

Voulez-vous dire 'if! @ Product.promotions', pluriel? – meagar

0

Essayez ceci:

def current_user 
    current_user_session.user if current_user_session 
end 

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

Ensuite, je réécris vos check_steps être:

checkout_steps.delete "registration" if signed_in? 

J'espère que cela aide!

+0

merci pour l'info, cela aiderait totalement si cette partie était cassée mais cela fonctionne bien. J'essaye de créer une méthode semblable qui vérifie le modèle de produit pour une «promotion» booléenne si la promotion est vraie qu'elle finira par sauter une étape d'expédition. thanks man –