The document discusses refactoring Ruby code to follow best practices like making code more readable, efficient, and flexible. It provides an example of refactoring a server restart/reload method to make the code more modular and ruby-like. The refactored code extracts a base daemon class that child classes like Nginx and Syslog inherit from. This allows calling methods like server.nginx.restart in a clearer way following ruby idioms.
5. class Server < ActiveRecord::Base
def reload_nginx(flag = :reload)
if flag == :reload
ssh("user", address, "sudo /etc/init.d/nginx reload")
elsif flag == :restart
ssh("user", address, "sudo /etc/init.d/nginx restart")
end
end
def reload_syslog(flag = :reload)
# almost same as above
end
end
7. class Server < ActiveRecord::Base
def reload_nginx
exec("/etc/init.d/nginx”, “restart")
end
def restart_nginx
exec(“/etc/init.d/nginx”, “restart”)
end
def exec(path, arg)
ssh("user", address, "sudo #{path} #{arg}")
end
end
8. Still don’t feel right
• If it is a C, it might OK but, doesn’t look
very nice when it comes to ruby.
9. What we want
server = Server.find(id)
server.nginx.restart
server.nginx.reload
13. class Base
class << self
def has_path(path)
self.path = path
end
end
end
class Nginx < Base
has_path “/etc/init.d/nginx”
end
class Syslog < Base
has_path “/etc/init.d/syslog-ng”
end
14. class Base
def exec(*args)
ssh(“root”, address, “#{self.path} #{args}”)
end
def reload
exec(:reload)
end
def restart
exec(:restart)
end
end
15. Finally
class Server
def nginx
@nginx ||= Daemons::Nginx.new(self)
end
end
Server.find(id).nginx.restart