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
原文地址:https://www.jb51.cc/ruby/270744.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。