Thursday, April 3, 2008

Merb Installing

I recently started updating an application I wrote called Easel (yes it's a CMS) to version 2.1 of Rails. It was originally written pre-1.0 Rails, so it needed some serious updates and I wanted to open source the application.

Today I talked with some co-workers bringing them up to speed on the 2.x updates as they had last used Rails somewhere around 1.1.6. While talking with them, the conversation led to competitors and my belief that Merb has great potential. I've loved the pluggable architecture and overall direction taken by Ezra and the Merb team from the beginning.

So, shortly after the meeting I decided to stop my update of Easel and migrate the application to Merb. I know what I'm after for functionality, I knew the code needed updating so I thought this was a great time to switch.

So, I'm going to post what I learn as I switch to Merb. This first post is about installing the gems, creating a basic app structure and adding one resource.

# Substitute vi for your favorite editor command
#
# --include-dependencies or -y is now default
#
$ sudo gem install merb

#
# output from gem install merb
#
Successfully installed merb-core-0.9.2
Successfully installed merb-action-args-0.9.2
Successfully installed merb-assets-0.9.2
Successfully installed merb-gen-0.9.2
Successfully installed merb-haml-0.9.2
Successfully installed merb-builder-0.9.2
Successfully installed merb-mailer-0.9.2
Successfully installed merb-parts-0.9.2
Successfully installed merb-cache-0.9.2
Successfully installed merb-more-0.9.2
Successfully installed merb-0.9.2
<snip>
#
# end output
#

#
# Install the Datamapper ORM
#
$ sudo gem install merb_datamapper


#
# Create an application skeleton
#

$ merb-gen app easel

#
# output from merb-gen app easel
#
RubiGen::Scripts::Generate
create app
create app/controllers
create app/helpers
create app/views
create app/views/exceptions
create app/views/layout
create autotest
create config
create config/environments
create public
create public/images
create public/stylesheets
create spec
create app/controllers/application.rb
create app/controllers/exceptions.rb
create app/helpers/global_helpers.rb
create app/views/exceptions/internal_server_error.html.erb
create app/views/exceptions/not_acceptable.html.erb
create app/views/exceptions/not_found.html.erb
create app/views/layout/application.html.erb
create autotest/discover.rb
create autotest/merb.rb
create autotest/merb_rspec.rb
create config/rack.rb
create config/router.rb
create config/init.rb
create config/environments/development.rb
create config/environments/production.rb
create config/environments/rake.rb
create config/environments/test.rb
create public/merb.fcgi
create public/images/merb.jpg
create public/stylesheets/master.css
create spec/spec.opts
create spec/spec_helper.rb
create /Rakefile
#
# end output
#

$ cd easel

$ vi config/init.rb

#Uncomment for DataMapper ORM
use_orm :datamapper

$ cp config/database.yml.sample config/database.yml

$ vi config/database.yml

#
# Edit to your database settings
#

#
# if using mysql, install the DataObjects::Mysql Driver
#
$ sudo gem install do_mysql

# Output from gem install do_mysql
#
Building native extensions. This could take a while...
Successfully installed data_objects-0.2.0
Successfully installed do_mysql-0.2.3
<snip>
#
# end output
#

# Let's run to make sure we can. You should get the not_found.html.erb
# exception page.

$ merb

# merb defaults to port 4000 so go to:
#
# http://localhost:4000
#

#
# So, lets generate a resource (controller, model, view)
#

$ merb-gen resource page content:text permanent_url:string is_enabled:boolean is_featured:boolean show_in_footer:boolean

#
# Output from merb-gen command
#
dependency model
exists app
create app/models
create app/models/page.rb
dependency merb_model_test
exists spec
create spec/models
create spec/models/page_spec.rb
dependency resource_controller
exists app
exists app/controllers
exists app/helpers
exists app/views
create app/views/pages
create app/controllers/pages.rb
create app/helpers/pages_helper.rb
create app/views/pages/edit.html.erb
create app/views/pages/index.html.erb
create app/views/pages/new.html.erb
create app/views/pages/show.html.erb
dependency merb_resource_controller_test
create spec/controllers/
create spec/helpers/
exists spec
exists spec/controllers
exists spec/helpers
create spec/views
create spec/views/pages
create spec/controllers/pages_spec.rb
create spec/helpers/pages_helpers.rb
create spec/views/pages/delete.html.erb_spec.rb
create spec/views/pages/edit.html.erb_spec.rb
create spec/views/pages/index.html.erb_spec.rb
create spec/views/pages/new.html.erb_spec.rb
create spec/views/pages/show.html.erb_spec.rb
#
# end output
#

#
# Check out the model, just for a looksee
#
$ vi app/models/page.rb

#
# Page model
#
class Page < DataMapper::Base
property :show_in_footer, :boolean
property :is_featured, :boolean
property :is_enabled, :boolean
property :content, :text
property :permanent_url, :string
end
#
# end page model
#

#
# Add pages to routes file
#
$ vi config/router.rb

#
# in Merb::Router.prepare do |r|
#

r.resources :pages

#
# Startup merb and access your new resource
#
# http://localhost:4000/pages
#



The resource generator just creates place holder files without any template form code like the Rails generator. From the Merb point of view, I completely understand. From the developer point of view, I'll have to write a more complete generator to save me some time.

There will be a lot more to come, but this post is super long already. :)

0 comments: