Railscasts发布了一篇关于重构的精彩剧集.一种方法是将复杂的控制器逻辑移动到服务对象中,而不是将其推送到模型中.在
one service object中,使用以下代码:
class PasswordReset attr_reader :user def self.from_email(email) new User.find_by_email(email) end def self.from_token(token) new User.find_by_password_reset_token!(token) end ... end
新关键词在两个方法体中的作用是什么?新用户.find_by_.这与User.find_by_有什么不同?
def create # controller password_reset = PasswordReset.from_email(params[:email]) if password_reset.user password_reset.send_email redirect_to root_url,notice: "Email sent with password reset instructions." else redirect_to new_password_reset_url,alert: "Email address does not match a user account." end end
另外,为什么attr_reader:用户需要?
解决方法
classname隐含在self方法中.代码可以写成:
def self.from_email(email) PasswordReset.new User.find_by_email(email) end
为了回答你问题的后半部分,attr_reader定义了一个实例变量和一个reader方法(如果你是来自java或c#,也称为getter方法).把它们放在一起,你可以把它写成:
class PasswordReset def user @user end def self.from_email(email) PasswordReset.new User.find_by_email(email) end def self.from_token(token) PasswordReset.new User.find_by_password_reset_token!(token) end ... end
这假设PasswordReset#initialize将User作为参数,并相应地设置@user