2011-01-09 7 views
3

Ich möchte dies tun:Was ist eine Ruby-ähnliche Art, diesen Befehl auszuführen?

sender_email = @request.user.paypal_email if @request.user.paypal_email == "[email protected]" 

Also im Grunde möchte ich nur den Befehl ausführen, wenn der Benutzer paypal E-Mail "[email protected]" ist. Das funktioniert gut, aber es scheint, als ob es Platz für Refactoring gibt.

+0

Es gibt nicht viel mehr Sie hier gegeben haben könnte einfach Was hast du in deinem Beispiel? Was ist der Kontext dieses Codes? Ein Model? –

+0

ist es in der Steuerung – Trace

+0

was machst du danach mit sender_email? Was passiert, wenn der Benutzer zum Beispiel eine normale E-Mail hat? – kikito

Antwort

5

Da dieser Code in Ihrem Controller ist, kann er definitiv refaktorisiert werden. Normalerweise möchten Sie, dass eine solche Logik in den Modellen enthalten ist, da es einfach ist Komponententests zu schreiben, und es ist nicht die Aufgabe des Controllers, so viel über das Benutzermodell zu wissen.

Es gibt ein paar Möglichkeiten, wie Sie diese Refactoring könnte, aber ich würde empfehlen, um die Logik zu dem Benutzermodell zu bewegen, wie so:

def User < ActiveRecord::Base 
    def sender_email 
    paypal_email if paypal_email == "[email protected]" 
    end 
end 

Dann wird Ihr Controller würde nicht so viel wissen müssen und konnte einfach tun:

sender_email = @request.user.sender_email 
+0

Ihr Code entspricht nicht dem Code von OP. Ihr wird sender_email auf nil setzen, wenn paypal_email! = "[email protected]", während der Code von OP ihn unverändert lässt. – adamax

+0

Stimmt, aber ich bin mir sicher, dass es noch mehr zu dem Bild gibt, das ebenfalls refaktoriert werden könnte. Es gibt wahrscheinlich mehr Code, der mit dieser Logik zusammenhängt. Meine Antwort war nur ein Beispiel dafür, warum und wie Sie die Modelllogik dahin verlagern sollten, wo sie hingehört. –

0

Natürlich könnten Sie mit einem Block neu schreiben, wenn, aber der einzige Unterschied ist die zukünftige Flexibilität oder "Lesbarkeit". Vielleicht sollte Ihre Frage sein "Bietet Schienen etwas, das dies tut?". Die Antwort auf diese Frage ist nicht, dass ich weiß. Wenn Ihr Code das tut, was Sie wollen, sehe ich keinen Grund, es zu ändern.

8
@request.user.paypal_email 

Einige würden befürworten, dass Sie nur einen Punkt verwenden ". (See 'Law of Demeter'.) Vielleicht möchten Sie Rails 'delegate' method

class User < ActiveRecord::Base 
    has_many :requests 
end 

class Request < ActiveRecord::Base 
    belongs_to :user 

    delegate :paypal_email, :to => :user 
end 

mit berücksichtigen Dann können Sie

@request.paypal_email 

schreiben oder wenn Sie

bevorzugen
class Request < ActiveRecord::Base 
    belongs_to :user 

    delegate :paypal_email, :to => :user, :prefix => true 
end 

@request.user_paypal_email 
Verwandte Themen