Following James Golick’s jamesgolick.com/2010/3/14/crazy-heretical-and-awesome-the-way-i-write-rails-apps.html, I thought I could implement something similar, without too much hassle.
NOTE: no code exists at the moment. These are only ideas.
# Sinatra, but Rails could use the same implementation
get "/posts" do
@posts = Zeus.posts
render :posts_index
end
get "/post/:id" do
@post = Zeus.posts.filter(:id => params[:id]).first
render :post
end
post "/posts" do
post = Post.new
post.title = params[:post][:title]
post.body = params[:post][:body]
post.published_at = Time.now.utc
Zeus.persist(post)
end
post "/post/:id/comments" do
post = Zeus.posts.filter(:id => params[:id]).first
comment = post.add_comment(params[:comment].merge(:ip => request.env["HTTP_REAL_IP"])
# Single DB transaction inserts both rows in the database
Zeus.persist(post, comment)
end
class Post
def initialize
@comments = []
end
def add_comment(attributes)
comment = Comment.new
comment.author_name = attributes[:name]
comment.author_email = attributes[:email]
comment.body = attributes[:body]
comment.author_ip = attributes[:ip]
@comments << comment
comment
end
end
class Comment
end
post = Post.new
post.title = "Zeus is a new library"
Zeus.configure do |config|
config.model :post, :table_name => "posts" do
string :title
text :body
integer :comments_count
datetime :published_at
datetime :created_at, :updated_at, :null => false
index :published_at
# A single argument for the block receives the Post object defined in the domain model.
before_create do |domain_post|
domain_post.created_at = Time.now.utc
end
# Accepting 2 arguments receives both the domain model instance, and the persistence model.
before_save do |domain_post, zeus_post|
zeus_post.comments_count = domain_post.comments.length
domain_post.updated_at = zeus_post.updated_at = Time.now.utc
end
end
# Convention over configuration
config.model :comment do
integer :post_id, :references => :posts
string :author_name, :author_email, :author_ip
text :body
float :spaminess
datetime :approved_at
datetime :created_at, :null => false
index :post_id, :created_at, :approved_at
end
end
-
Fork the project.
-
Make your feature addition or bug fix.
-
Add tests for it. This is important so I don’t break it in a future version unintentionally.
-
Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
-
Send me a pull request. Bonus points for topic branches.
Copyright © 2010 François Beausoleil. See LICENSE for details.