Created
August 23, 2011 21:31
-
-
Save anderscarling/1166633 to your computer and use it in GitHub Desktop.
Remote Switch for ohlzon
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Usage | |
# # Turn on | |
# RemoteSwitch.new(params[:id]).on! | |
# | |
# # Turn off | |
# RemoteSwitch.new(params[:id]).off! | |
# | |
# Raises exception | |
# RemoteSwitch.new("not an id") | |
# | |
# Din rails controller borde se ut ungefär såhär: | |
# class RemoteSwitchesController < ApplicationController | |
# # /remote_switches/1/on | |
# def on | |
# # När ruby ser denna raden för första gången försöker Ruby leta upp klassen "RemoteSwitch", | |
# # Rails har hooks som automatiskt försöker laddar in den från /app/models/remote_switch.rb | |
# # om den inte "existerar" än. | |
# # | |
# # Det är safe att skicka in params[:id] direkt in i klassen, | |
# # eftersom vi vet att den ansvarar för inputvalidering. | |
# # Skulle någon skicka något som får raise(..) raden i #initialize nedan att reagera, | |
# # så kommer exceptionet fångas av rails som skickar en till en HTTP 500 "internal application error". | |
# # Det går att skriva egna (klasslokala eller generella) felhanteringsmetoder. | |
# # | |
# RemoteSwitch.new(params[:id]).on! | |
# end | |
# | |
# end | |
class RemoteSwitch | |
# Har du ett begränsat antal godkända idn så kan det vara en schyst | |
# idé att definera dem såhär. | |
VALID_IDS = [1,2,3] | |
# call-seq: RemoteSwitch.new(unit_id) | |
# (metoden anropas som ovan, det är en inbyggd "ruby"-mekanik att .new | |
# skapar ett objekt och kör initialize med parametrarna som .new fick) | |
def initialize(unit_id) | |
raise(RuntimeError, "Invalid RemoteSwitch id") unless VALID_IDS.include?(unit_id) | |
@unit_id = unit_id | |
end | |
# Att metoden har ett utropstecken i slutet är rent "estetiskt", | |
# praxis är att använda det till "farliga" metoder som förändrar i ett | |
# objekt eller av annan anledning bör användas med omsorg. | |
def on! | |
# Överkurs 1.0: Här skulle du kunna lägga din kod direkt | |
exec_in_shell "turn on this shitznas" | |
end | |
def off! | |
# Överkurs 1.1: Här skulle du kunna lägga din kod direkt | |
exec_in_shell "turn off this shitznas" | |
end | |
# Överkurs 1.2: | |
# ingen skall calla våra externa helpermetoder från utsidan, därför | |
# gör vi dem privata så det inte går att calla dem utan att trixa en | |
# del. | |
private | |
# Överkurs 1.3 | |
# Följde du övriga överkurserna har du en generell helper här där du | |
# gör allt som har att göra med att köra kod externt, all delad logik | |
# dvs | |
def exec_in_shell(cmd) | |
# fork { exec(cmd) } | |
end | |
end | |
# Överkurs 2.0 | |
# innehållet i den här skulle kunna läggas ovanför private (osäker på om | |
# private påverkar den, men iaf) i klass-blocket ovanför för att skapa en | |
# separat, "mera ActiveRecord-lik" metod för att skapa | |
# RemoteSwitch-instanser. | |
# | |
# Det finns ingen poäng med att lägga det här i ett separat class..end | |
# block förutom att jag då håller undan det från det viktiga så det inte | |
# stör för dig ;) Det fungerar att ha det i en separat klass, du kan | |
# "öppna" en klass och lägga till metoder hur många gånger som helst, | |
# sällan vettigt i sådana här enkla fall dock. | |
# | |
# Usage: | |
# RemoteSwitch.find(params[:id]).on! | |
class RemoteSwitch | |
def self.find(uid) | |
# Observera att vi inte inte behöver använda RemoteSwitch.new här | |
# i sak är det som händer att "self" här pekar på klassen RemoteSwitch | |
# (inte en instans av klassen). | |
# RemoteSwitch.new(uid) hade betytt precis samma sak | |
new(uid) | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment