Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在这个Ruby方法定义中,`new`关键字是如何工作的?_Ruby On Rails_Ruby_Refactoring - Fatal编程技术网

Ruby on rails 在这个Ruby方法定义中,`new`关键字是如何工作的?

Ruby on rails 在这个Ruby方法定义中,`new`关键字是如何工作的?,ruby-on-rails,ruby,refactoring,Ruby On Rails,Ruby,Refactoring,铁路工人们推出了一个关于重构的伟大插曲。一种方法是将复杂的控制器逻辑移动到服务对象中,而不是将其向下推到模型中。在中,使用以下代码: 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!(

铁路工人们推出了一个关于重构的伟大插曲。一种方法是将复杂的控制器逻辑移动到服务对象中,而不是将其向下推到模型中。在中,使用以下代码:

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
关键字在两个方法体中都起什么作用<代码>新用户。通过查找查找。这与
用户有何不同。通过
查找

以下是呼叫代码:

  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\u reader:user

类名称隐含在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

@dae,User。通过电子邮件(email)查找是PasswordReset构造函数的参数。我现在明白了。非常感谢。然而,你实例化一个对象而不是实例化它自己,这看起来很奇怪。这个图案有名字吗?还是正常?对不起,我知道我很慢。我想我不习惯用Ruby思考。我假设
attr\u读取器
返回
@user
nil
?它只是在实例中寻找一个名为
user
的东西吗?在一次代码回顾中,我甚至认为使用裸
new
是不直观的,它迫使任何支持它的人阅读整个方法,甚至是类,只是为了看看发生了什么。使用
PasswordReset.new
更清晰,并且可以自我记录。即使是带有括号中的参数的
new(…)
也会有所改进,因此-1用于最初编写代码的人,+1用于建议更干净/更清晰的解决方案。有人愿意回答我的评论吗?@theTinMan:如果有人不知道
self
是Ruby中的隐式接收器,他们可能一开始就不应该做支持工作!你能重写标题,使它反映出你想知道的一个实际问题吗?你可以用他们喜欢的鱼饵钓到更多的鱼。