2011-01-09 74 views
3

我想这样做:做这个命令的更类似Ruby的方式是什么?

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

所以基本上我想,如果用户的PayPal电子邮件是"[email protected]"仅执行命令。这工作正常,但似乎有重构的空间。

+0

没有更多的,你可以在这里做的只是给你的例子中有什么。这段代码的上下文是什么?一个模型? – 2011-01-09 22:26:28

+0

它在控制器中 – Trace 2011-01-09 22:42:06

回答

5

由于此代码在您的控制器中,因此它肯定可以被重构。您通常希望像这样的逻辑存在于模型中,因为编写单元测试很容易,而且对控制器的工作并不了解用户模型。

有你可以重构这几种方法,但我会建议的逻辑移动到用户模型像这样:

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

然后控制器将不需要知道的太多,可能只是这样做:

sender_email = @request.user.sender_email 
0

当然,如果可以使用块重写,但唯一的区别是未来的灵活性或“可读性”。也许你的问题应该是“铁轨是否提供了这样做?”。这个问题的答案并不是我所知道的。如果你的代码做了你想要的,我没有理由去改变它。

8
@request.user.paypal_email 

有人会主张,你只用一个点“。 (See 'Law of Demeter'.)你可能要考虑使用Rails 'delegate' method

class User < ActiveRecord::Base 
    has_many :requests 
end 

class Request < ActiveRecord::Base 
    belongs_to :user 

    delegate :paypal_email, :to => :user 
end 

然后,你可以写

@request.paypal_email 

或者如果你喜欢

class Request < ActiveRecord::Base 
    belongs_to :user 

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

@request.user_paypal_email