12. it quot;tracks implicit observable modelsquot; do
instance = FooObserver.new
instance.send(:observed_classes).should include(Foo)
instance.send(:observed_classes).should_not include(ObservedModel)
end
18. import java.lang.reflect.*;
public class Book {
@Size(min=1, max=23)
protected String title;
public Book (String title) {
setTitle(title);
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isValid()
throws NoSuchFieldException, SecurityException {
Size size = (Size) this.getClass().getDeclaredField(quot;titlequot;)
.getAnnotation(Size.class);
return ( title != null && ( title.length() >= size.min()
|| title.length() <= size.max() ) );
}
}
19. import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Size {
public int max() default 0;
public int min() default 0;
}
20. module Validations
def validates_presence_of(*attributes)
# ...
end
def validates_size_of(*attributes)
# ...
end
end
class Book
extend Validations
validates_presence_of :title
validates_size_of :title, 1..23
end
21. Nella mia esperienza,
la cosa più affascinante è che i
programmi Ruby ben scritti sono
già un DSL, a causa della sintassi
del linguaggio.
Jamis Buck - 37 signals
24. Method Class
class Carrot < ActiveRecord::Base
belongs_to :bunny
end
class Bunny < ActiveRecord::Base
has_many :carrots
end
25. Top Level
namespace :db do
desc quot;Create a database connection.quot;
task :connect do
# ...
end
desc quot;Prepare the database for tests.quot;
task :prepare => :connect do
# ...
end
end
26. Sandbox
ActiveRecord::Schema.define do
create_table :bunnies do |t|
t.column :name, :string, :null => false
end
end
ActiveRecord::Schema.define do
drop_table :bunnies
end