I mentioned this, er, maybe on this list, or maybe on the Ramaze list, I'm not
sure, a month or so ago, as something I was trying to do. I've now done it, and
thought I'd share the code for comment and in case it was useful for other
people.
As I continue building this web site that lets staff members access Employees
and Sales Items and such (table names changed to protect the uninvolved), I
kept having to construct links to the page that would display, say, a single
employee's record, or a single sales record, or a single product, ad nauseum.
The HTML would look something like:
<a href="/employee?id=43253">Fred Flintstone</a>
I was getting kind of tired of doing this over and over (assume 'emp' contains
an employee dataset row):
'<A href="/employee?id=' + emp[:id] + '">' + emp[:name] + '</a>'
So I created a module that lets me do this, instead:
emp.link{emp[:name]}
It creates an XML unit (not a string, although it easily could, of course) that
wraps an anchor around the block and builds a URL for it from the data in the
database, like this:
<A HREF="/{name of Model}?id={primary_key_value}">{contents of
block}</A>
Yes, this is a gross violation of that whole MVC thing, since I'm mixing my
view with my model, but only the Sequel::Model possesses the knowledge of what
the primary key is. {shrug}
My code, which I include into selected Sequel::Models, looks like this:
module DBLink
require 'sequel/extensions/inflector'
include String::Inflections
def link(&contents)
PageUnit::link("/"+self.class.to_s.downcase.pluralize +
"?id=" + self.pk){yield(contents)}
end
public :link
end
This is only partially helpful, because it's invoking my PageUnit class which
contains a lot of other constructors for blasting out HTML without having to
putter around with it. The non-depended equivalent is this:
module DBLink
require 'sequel/extensions/inflector'
include String::Inflections
def link(&contents)
REXML::Element.new("a").add_attribute(:href,
"/"+self.class.to_s.downcase.pluralize + "?id=" +
self.pk).add_text(yield(contents))
end
public :link
end
(I'm not sure why I had to force 'link' public, but I did.)
In use, my model.rb file looks something like
class Employee < Sequel::Model
include DBLink
[...other stuff...]
end
class Product < Sequel::Model
include DBLink
end
Thoughts, comments, opinions, brickbats, sarcasm?
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sequel-talk?hl=en.