Unsorted list of features, howto's, suggar and evils of ruby (on rails)
BAD
-----------------------
model files do not contain the classes field information
instead this is stored in different 'migration' files
create_table "periods" do |t|
t.column "target_id", :integer
t.column "target_type", :string
t.column "start_at", :datetime
t.column "end_at", :datetime
t.column "wholeday", :boolean
t.column "wholeweek", :boolean
t.column "allweeks", :boolean
end
NO inbuild multi dimensional arrays
DANGER!!!!!
and is not && !!!!!!!!!!!!!!!!!!!!!!!!
return x==7 and y==8 => void value expression!!!
return x==7 && y==8 !!!
nr==0 (evaluates string.nil? !!!!!!! "0"==0 -> false!!!!)
nr.to_i==0 !!
+ operator for string is really baad :
cannot convert nil into String !!!
puts "teacher "+ @lesson.teacher
"last saved : "+ DateTime.now.to_s
"nr"+rand(10).to_s
Language buggy: (see http://public.transcraft.co.uk/blog/index.html)
ActionController::RoutingError (Recognition failed for "/images/btnbg.gif"):
helpers are only for views!! (ApplicationController is what you need)
@links = Link.find_by_sql [
"SELECT * from links where link like '"+ @a +"%' order by id asc"]
s = "Hello, world"
/^Hello/.match( s ) >> true
/world$/.match( s ) >> true
<!--bad philosopy : evaluation inside html comments?
<%#= datetime_select 'lesson', 'end_at' %></p>-->
-------------------------------------
Good
********************
class.byname:
alle= eval(type+".find(:all)")
Object.const_get("Array")
# default values
def initialize(definitions=[], word = nil)
@definitions = definitions
@word = word
end
rake db_schema_dump !!! instead of writing the migration files yourself
rake --help
rake migrate VERSION=n
Customer.find_all [ "company = ?", company ]
und wenn man eine LIKE '%xx%' Abfrage erstellen möchte:
Customer.find_all [ " company LIKE ? ", '%#{company}%' ]
string arrays:
x= %w(Montag Dienstag) is short for
y= ["Montag" ,"Dienstag"]
<%= sortable_element('listOrTableId' , :url => { :action => 'move' })
<%= observe_field(:search,
:frequency => 0.5,
:update => :results,
:url => { :action => :search },
:loading => "Element.show('indicator_gif_id')",
:complete => "Element.hide('indicator_gif_id')")
%>
/// HOW TOs (mixed with 'good')
global functions !
put them in application.rb (ApplicationController)
Regular expressions
#substitute patterns (m=LineBreaks u=Unicode i=IgnoreCase)
a=a.gsub(/<img.*?>/mui, "")
send_file or send http response data
send_data @person.picture, :filename => @person.filename, :type => "image/jpeg", :disposition => "inline"
require 'net/ftp'
ftp = Net::FTP.new('ftp.netlab.co.jp')
ftp.login files = ftp.chdir('pub/lang/ruby/contrib')
files = ftp.list('n*')
ftp.getbinaryfile('nif.rb-0.91.gz', 'nif.gz', 1024)
ftp.close
list.class.reflect_on_all_associations
>>>>>>>regex<<<<<<<<
// greedy !!!!
puts "a[bcb]d[bebb]rerberb]w[bsdaeb]ega".scan(/\[b(.*)b/).inspect
=>cb]d[bebb]rerberb]w[bsdae
// .*? not greedy ++
puts "a[bcb]d[bebb]rerberb]w[bsdaeb]egab".scan(/\[b(.*?)b/).inspect
=> [["c"], ["e"], ["sdae"]]
require 'net/http'
require 'uri'
img='http://www.macdesktops.com/?res=TRUE&category=35'
html=Net::HTTP.get URI.parse(img)
def search
@results = Search.find(params[:query])
case @results
when 0 then render :action=> "no_results"
when 1 then render :action=> "show"
when 2..10 then render :action=> "show_many"
end
end
module Action
VERY_BAD = 0
BAD = 1
def Action.sin(badness)
end
end
require "trig"
require "action"
MIXINS
module Debug
def whoAmI?
"#{self.type.name} (\##{self.id}): #{self.to_s}"
end
end
class Phonograph
include Debug
end
class EightTrack
include Debug
end
ph = Phonograph.new("West End Blues")
et = EightTrack.new("Surrealistic Pillow")
time=5.minutes + 30.seconds
5.times do |i|
File.open("temp.rb","w") { |f|
f.puts "module Temp\ndef Temp.var() #{i}; end\nend"
}
load "temp.rb"
puts Temp.var
end
print "Enter your name: "
name = gets
Argumentlisten variabler Länge
Was aber, wenn Sie eine variable Anzahl von Argumenten übergeben wollen oder mehrere Argumente mit einem einzigen Parameter auffangen wollen? Wenn Sie einen Stern vor den Namen des Parameters nach den ``normalen'' Parametern setzen, wird genau das gemacht.
def varargs(arg1, *rest)
"Got #{arg1} and #{rest.join(', ')}"
end
y = Trig.sin(Trig::PI/4)
wrongdoing = Action.sin(Action::VERY_BAD)
puts "It's not a number" if isanum.nil?
rescue ScriptError, StandardError
printf "ERR: %s\n", $! || 'exception raised'
eval(line).inspect
if a =~ /^[-+]?\d+$/;
puts "It's a number that may indicate positive or negative"
end
Does anyone know how to get an ID back, instead of a String?
@doctor = Doctor.find_by_name(params[:doctor][:name])
params[:parent][:doctor] = @doctor
IO.foreach("testfile") { |line| puts line }
arr = IO.readlines("testfile")
require 'socket'
client = TCPSocket.open('localhost', 'finger')
client.send("oracle\n", 0)
puts client.readlines
client.close
require 'net/http'
h = Net::HTTP.new('www.pragmaticprogrammer.com', 80)
resp, data = h.get('/index.html', nil)
if resp.message == "OK"
data.scan(/<img src="(.*?)"/) { |x| puts x }
end
f = File.open("testfile")
begin
f.each_line {|line| puts "Got #{line.dump}" }
raise ArgumentError, "Name too big", caller
rescue ArgumentError
else
puts "Congratulations-- no errors!"
ensure
f.close unless f.nil?
end
def promptAndGet(prompt)
print prompt
res = readline.chomp
throw :quitRequested if res == "!"
return res
end
catch :quitRequested do
name = promptAndGet("Name: ")
age = promptAndGet("Age: ")
sex = promptAndGet("Sex: ")
end
require 'breakpoint'
Thread.new do
loop do
begin
breakpoint
rescue Exception
end
end
end
<script type="text/javascript" language="javascript" charset="utf-8">
// <![CDATA[
Sortable.create('sortlist',{ghosting:false,constraint:false,hoverclass:'over',
//onUpdate:function(sortable){alert(Sortable.serialize(sortable))},
onChange:function(element){
var data= Sortable.serialize(element.parentNode);
var url="<%=url_for :controller=>'question',:action=>'move'%>";
new Ajax.Request(url,{parameters:data});
}
});
// ]]>
</script>