Initial release of Elemental
Posted by Michael on February 3, 2009 in Programming, Ruby Language
I am happy to announce the initial release of Elemental 0.1.1.
Elemental provides enumerated collection of elements that allow you to associate ruby symbols to arbitrary “display” values, thus allowing your code to think symbolically and unambiguously while giving you the means to easily display what end-users need to see. Additionally, symbols are associated with ordinal values, allowing easy storage/retrieval to persistent stores (databases, files, marshalling, etc) by saving theĀ Element#value as appropriate (String by default, Fixnum if you “persist_ordinally”).
The primary aim of Elemental is to collect and abstract literals away from your code logic. There’s an old programmer’s wisdom that you should not encode your logic using literal values, especially those the end-user is exposed to.
Complete details provided in README.txt
http://github.com/mwlang/elemental/tree/master
http://rubyforge.org/projects/elemental/
From Gem:
sudo gem install elemental
From Source:
gem install bones, rake, test-unit git clone git://github.com/mwlang/elemental.git cd elemental rake gem:package cd pkg sudo gem install elemental
Example of Using:
Here’s an example of how Elemental might be used with a Rails application. In your ~/config/initializers/elementals.rb file:
require 'elemental' class PublicStatus extend Elemental member :unpublished, :display => "Not Published", :default => true member :editor_approval, :display => "Editorial Approval Needed" member :published, :display => "Published" member :archived, :display => "Archived" end class CommentType extend Elemental persist_ordinally member :all, :display => "Anyone can post" member :moderated, :display => "Moderated", :default => true member :closed, :display => "Closed to new posts" end
Create a “posts” table with this migration:
class CreatePosts < ActiveRecord::Migration
def self.up
create_table :posts do |t|
t.string :title
t.text :body
t.string :public_status
t.integer :comment_type
t.timestamps
end
end
def self.down
drop_table :posts
end
end
In your ~/app/views/posts/edit.html.erb:
<h1>Editing post</h1>
<% form_for(@post) do |f| %>
<%= f.error_messages %>
<%= render :partial => 'form' %>
<p>
<%= f.submit "Update" %>
</p>
<% end %>
<%= link_to 'Show', @post %> |
<%= link_to 'Back', posts_path %>
Similarly for ~/app/views/posts/new.html.erb
<h1>New post</h1>
<% form_for(@post) do |f| %>
<%= f.error_messages %>
<%= render :partial => 'form' %>
<p>
<%= f.submit "Create" %>
</p>
<% end %>
<%= link_to 'Back', posts_path %>
An form partial that utilizes the Elemental classes above to populate a pair of drop down lists:
<p>
<label>Title</label><br />
<%= text_field :post, :title, :value => @post.title %>
</p>
<p>
<label>Body</label><br />
<%= text_area :post, :body, :value => @post.body %>
</p>
<p><label>Public Status</label><br />
<%= select "post", "public_status",
PublicStatus.sort.map{|a| [a.display, a.value]},
{ :include_blank => false, :selected => PublicStatus.defaults.first.value }
%></select>
</p>
<p><label>Comment Type</label><br />
<%= select "post", "comment_type",
CommentType.sort.map{|a| [a.display, a.value]},
{ :include_blank => false, :selected => CommentType.defaults.first.value }
%></select>
</p>
An example ~/app/views/posts/index.html.erb file:
<h1>Listing posts</h1>
<table border=1 cellpadding=5px>
<tr>
<th>Post</th>
<th>Public status</th>
<th>Comment type</th>
<th colspan=3>Actions</th>
</tr>
<% for post in @posts %>
<tr>
<td><%= link_to post.title, post, :title => post.body %></td>
<td><%=h PublicStatus[post.public_status].display %></td>
<td><%=h CommentType[post.comment_type].display %></td>
<td><%= link_to 'Show', post %></td>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
<td><%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New post', new_post_path %>

Stumble It!