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中的隐式接收器,他们可能一开始就不应该做支持工作!你能重写标题,使它反映出你想知道的一个实际问题吗?你可以用他们喜欢的鱼饵钓到更多的鱼。