Skip to content

Instantly share code, notes, and snippets.

@anderscarling
Created August 23, 2011 21:31
Show Gist options
  • Save anderscarling/1166633 to your computer and use it in GitHub Desktop.
Save anderscarling/1166633 to your computer and use it in GitHub Desktop.
Remote Switch for ohlzon
# 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