什么是更像Ruby的方式来执行此命令?

我想这样做:

sender_email = @request.user.paypal_email if @request.user.paypal_email == "paypal@anonymous.com" 

所以基本上我只想执行命令,如果用户paypal电子邮件是"paypal@anonymous.com" 。 这很好,但似乎有重构的余地。

由于此代码在您的控制器中,因此它肯定可以重构。 您通常希望这样的逻辑在模型中,因为编写unit testing很容易,并且控制器的工作不是很了解用户模型。

有几种方法可以重构这个,但我建议将逻辑移动到用户模型,如下所示:

 def User < ActiveRecord::Base def sender_email paypal_email if paypal_email == "paypal@anonymous.com" end end 

然后你的控制器不需要知道多少,可以这样做:

 sender_email = @request.user.sender_email 
 @request.user.paypal_email 

有些人会主张你只使用一个点’。 ( 参见“Demeter法则”。 )您可能需要考虑使用Rails’委托’方法

 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 

当然,你可以使用块重写,但唯一的区别是未来的灵活性或“可读性”。 也许你的问题应该是“轨道是否提供了这样做的东西?”。 这个问题的答案并非我所知道的。 如果您的代码符合您的要求,我认为没有理由对其进行更改。