`new`关键字如何在这个Ruby方法定义中工作?

时间:2013-04-01 14:33:31

标签: ruby-on-rails ruby refactoring

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

new关键字在两个方法体中的作用是什么? new User.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 :user

1 个答案:

答案 0 :(得分:11)

classname隐含在self方法中。代码可以写成:

 def self.from_email(email)
    PasswordReset.new User.find_by_email(email)
 end

要回答问题的后半部分,attr_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