Tip: Link to Unimplemented
52 comments Latest by dsadf@yahoo.com Fri, 27 Aug 2010 02:18:01 GMT
Throughout our design and development process, we’re working around areas of the site that are not yet implemented but we also want to be able to allow our clients to demo their application. In an effort to manage their expectations, we need to be careful about what we link to. If a page/widget isn’t ready to be demo’d yet, we should avoid providing pathways to get interact with or navigate there. However, when we’re implementing HTML/CSS for pages, it’s sometimes makes sense to not hide certain things on the screen.
For example, let’s suppose that you’re working on the primary navigation of an application. You know what the other sections are going to be, but you’ve only implemented a few of them so far. Your HTML/CSS person is working on the design for the navigation and wants to have them be proper links… even to pages that don’t yet exist.
One option, which is quite common, is to provide a link with href="#". This works to some extent, but when people click on things, they naturally expect something to happen in response.
This approach doesn’t mesh well with our team as we don’t really want to field any questions like, “the navigation links are all broken. Nothing happens!”
So, a pattern that we’ve been using for a while is to trigger a javascript alert for every link within an implemented area that is linking to something that isn’t yet implemented.
Let’s take a really basic javascript function like:
# public/javascripts/application.js
function unimplemented() {
alert("NOTICE\n\nThis feature is not implemented yet. Please check back again soon!");
}
This allows us to do the following:
<a href="javascript:unimplemented();">link text</a>
When someone clicks the link, they’ll see a typical javascript alert message. This informs our clients/beta testers that we’re paying attention to what works and what doesn’t.
Let’s take it a step further and push this into a view helper.
# app/helpers/application_helper.rb
def link_to_unimplemented( link_text, *args )
link_to_function( link_text, 'unimplemented()', *args)
end
Now, we’re able to use link_to_unimplemented and pass any arguments that you’d pass to the default link_to view helper.
<%= link_to_unimplemented( 'link text', { :class => 'link_class_name' } ) -%>
Now our web designers can go about their work and use this helper as necessary.
An nice benefit for doing this is that we have a pattern that we follow so that we can rely upon to make sure that we don’t forget anything. This is the equivalent of adding @TODO@s throughout our code base.
If we search through app/views for ‘link_to_unimplemented’ we should be able to prevent missing any broken links. In the next screenshot, I’m using grep with colorized matches.
As you can see, we have something left to implement in that area of the application. :-)
This has been one of those lightweight patterns that we’ve been able to adopt and it’s definitely helped manage the expectations of our clients throughout our development process.
I’d love to hear your thoughts on this. How does your team handle things like this?
Related Posts
Enjoying the content? Be sure to subscribe to my RSS feed.








imo a better approach would be to use link_to_unimplemented(NORMAL_LINK_TO_SYNTAX_HERE) so everything can be wired up beforehand.
When it is finally ready, just replace link_to_unimplemented with link_to and your done.
PS: some unobstrusive sugar for you New Feature
$(‘a.unimplemented’).click(function(){alert(‘oh noes!!!’)}) (jquery)Not that I’ve tried this, but your post sparked an idea in my head… one could use named routes to go ahead and link to the appropriate place, but in the
routes.rbfile, point all the unimplemented things to the same page, e.g.map.with_options :controller => 'feature' do |m| m.feature 'feature/view', :action => 'unimplemented' endIn the
applicationcontroller, add a method called unimplemented with a friendly view (so it’s available in all controllers).Now, you have one file (
routes.rb) that lists all the unimplemented features, and you can change the action appropriately as features are implemented.You can link to features with the named routes without having to worry about going back and fixing all the links.
Of course, this doesn’t work so smoothly with fancy-pants REST routes and the like (which I don’t use).
Thoughts?
@grosser: yeah, that’s an interesting idea.
The helper would probably need to append a class to it that wouldn’t affect any CSS class definitions made.
Intersting idea. I like this approach much better than the old familiar anchor tags. Thanks for sharing Robby.
@grosser: I thought more about your idea and don’t think we could safely rely on that. If we haven’t implemented an area (yet)... your approach would require us to have routes pre-determined (and working)... or we’d need to hardcode paths, which doesn’t do us any favors.
I like the unobtrusive approach, but given that we’re linking to thinks that don’t exist or aren’t working, I’d prefer there to be less heavy lifting. Also, it allows our web designers to do their work before the developers go through and making things work. They don’t need to be bogged down by defining routes (especially if they don’t exist yet).
Still an interesting idea for when you do have that stuff figured out. :-)
I’ve been using my similar to_do_link helper on every project I’ve worked, so I suppose that’s a kind of natural pattern. As you said it’s tremendously useful, mainly in iterative development where users can explore applications under development.
What I do is usually put this in my routes:
And then grep for
not_implemented_path. Also, you could comment that line and see which view specs fail, too.Nice tip. I always do this by hand but a helper is… helpful :) And I guess it can be used with image links as well, using image_tag instead of the text.
I really don’t get the not_implemented_path thing… What Bad^H ^H ^HRobby is focusing on deals with user experience during the development. This is the goal, and his javascript thing is a pretty good idea.
Unobstrusive js is also unnecessary, unless Robby wants to keep features not implemented for months.
Last but not least, if you really want to redirect to some stupid and unnecessary controller (IMHO), add a HTTP 204 status then with :status => 204. (Naaaaa just don’t do it!)
The other thing to do before final deploy would be to rename the helper method (or make it throw an exception?) and make sure all tests pass; if any calls to it remain, you’re not done!
Seems like this would be nice with a modal window/facebox implementation.
Brilliant; thank you. After reading your post, I did the following, so that link_to works the same as usual, and the unimpl_url looks like any other URL helper. Less to change when you have the real path ready.
== in the view == <%= link_to 'compare', unimpl_url %> == application_helper.rb == def unimpl_url "javascript: alert('This feature is not implemented yet...'); return false;" endThanks again, Matt
Brilliant; thank you. After reading your post, I did the following, so that link_to works the same as usual, and the unimpl_url looks like any other URL helper. Less to change when you have the real path ready.
== in the view == <%= link_to 'compare', unimpl_url %> == application_helper.rb == def unimpl_url "javascript: alert('This feature is not implemented yet...'); return false;" endThanks again, Matt
nike shox ghd hair straightener china wholesale
Welcome to check on our website!Any needs or any orther questions, welcome to contact us at any time ! Shopping online offers lots of benefits that you won’t find shopping in a store or by mail. The Internet is always open — seven days a week, 24 hours a day — and bargainscan be numerous online.With a click of a mouse, you can buy an airline ticket, book a hotel, send flowers to a friend .
let’s suppose that you’re working on the primary navigation of an application. You know what the other sections are going to be, but you’ve only implemented a few of them so far.
you have one file (routes.rb) that lists all the unimplemented features, and you can change the action appropriately as features are implemented
ugg classic mini
supra tk society black white
Vibram Five Fingers fragile and flexible shape, they follow your feet, are installed in every toes and work as the second skin to provide protection, enhance sensory awareness.This five fingers shoes is the core of the patent Vibram exclusive platform, thin and lightweight, it with your feet, and movement of terrain let you in your feet, and shall protect the surface. Soft and elastic half part of shape, polyamide follow that your feet platform. Vibram shoes are adopting a shield Five Fingers fresh antibacterial structure, keep the washing machine.This is the best of today’s most fashionable and useful shoes, welcome to actively purchase.
ugg classic short black boots ugg classic short black boots ugg lo pro autton ugg lo pro autton mbt chapa caviar mbt chapa caviar
ugg Classic Short Paisley grey ugg Classic Short Paisley grey mat chapa gtx mat chapa gtx mbt chapa heather mbt chapa heather
YTRY TR Y
TERT ER TER T
TERT ER TER T
TRY TRY T
try try rt yrt
ertre ert
rty er
tr
I’ve been using my similar to_do_link helper on every project I’ve worked, so I suppose that’s a kind of natural pattern. As you said it’s tremendously useful, mainly in iterative development where users can explore applications under development.
ytry rt
iron on transfer Jewish Directory Bar Mitzvah Wholesale menu keep jersey city shenzhen direct shenzhen discount shenzhen buy shenzhen city affiliate promos bars cash disco tumblr city star jar twink pinoy agency oak bar stool bar accessories Flair Bartending Posi Pourers
Demonstrate a unique new conceptjordan shoesAwA368
Louis Vuitton Mini Pochette Accessoires N58009 Louis Vuitton Mini Pochette Accessoires Louis Vuitton EVA CLUTCH N55213 Louis Vuitton EVA CLUTCH Louis Vuitton Mini Pochett N58011 Louis Vuitton Mini Pochett Louis Vuitton Brooklyn PM N51210 Louis Vuitton Brooklyn Louis Vuitton Brooklyn MM N51211 Louis Vuitton Brooklyn Louis Vuitton Brooklyn GM N51212 Louis Vuitton Brooklyn Louis Vuitton Bastille N45258 Louis Vuitton Bastille Louis Vuitton Spencer Bag N58021 Louis Vuitton Spencer Bag Louis Vuitton Naviglio N45255 Louis Vuitton Naviglio Louis Vuitton Beaubourg Damier N52006 Louis Vuitton Beaubourg Damier Louis Vuitton Broadway N42270 Louis Vuitton Broadway Louis Vuitton Pochette Bosphore N51111 Louis Vuitton Pochette Bosphore Louis Vuitton Laptop Sleeve 13 N58022 Louis Vuitton Laptop Sleeve 13 Louis Vuitton Laptop Sleeve 15 N58023 Louis Vuitton Laptop Sleeve 15 Louis Vuitton Olav PM N41442 Louis Vuitton Olav Louis Vuitton Geronimos N51994 Louis Vuitton Geronimos Louis Vuitton Macao Clutch N61739 Louis Vuitton Macao Clutch Louis Vuitton Pochette Saint Louis N51993 Louis Vuitton Pochette Saint Louis
it is very nice,useful for me,thank you for your sharing.
really really really nice post.
yess..very nice post.
Ugg sheepskin boots bring you warm, a lot of people often sit in the office most afraid of winter comes, because winter day to sit in the office, sat motionless naturally special cold feet. Words can literally ravaged boots, very soft, for joint pants. Ugg boots clearance to introduce to this, we welcome the presence of our online shop.
that tip is usefull thanks
don ed hardy ed hardy men sunglasses ed hardy men ties
vibram five fingers Vibram Five Fingers Men’s KSO Trek black-black Vibram Five Fingers Men’s KSO Trek brown-brown
iphone deals iphone for sale 3g iphone for sale iphone on sale apple iphone for sale iphone hot
ication. In an effort to manage their expectations, we need to be careful a
jordans 19,jordans 19
Air Jordan 10 Retro Shoes,Air Jordan 10 Retro Shoes
Retro Air Jordan 7,Retro Air Jordan 7
Retro Air Jordan 8,Retro Air Jordan 8
Retro Air Jordan 9,Retro Air Jordan 9
Retro Air Jordan 10,Retro Air Jordan 10
Air Jordan Retro 11,Air Jordan Retro 11
Air Jordan Retro 12,Air Jordan Retro 12
Air Jordan 11 Retro Shoes,Air Jordan 11 Retro Shoes
Louis Vuitton thousandslouis vuitton designer sales such as LV handbagsGoLouisVuittonlv bags thousands offer the
really really really nice post.
One replica franck muller watch site does have the watch listed as “Coming Soon”. limited replica watches edition 75. the design of the watch replica watches into the fashion details, is a mechanical automatic Jaeger-LeCoultre Calibre 956. a touch screen tickles the curiosity and promotes an interactive fake juicy couture handbags relationship aaa replica handbags between the brand and its customers. super energy-saving mode. chronograph and tachometerCase 316L steel and carbon fibreRotating bezelScratch-resistant sapphire crystal Engraved back with interchangeable medals Water-resistant to 100 mLimited edition of 9002Dial Black carbon 30-minute. it can display the month and time indications swatch watches of the equation. If you love sea diving or a money scheme must-watch Cikuan professional superior fake bedat performance. Launched in 1953 to celebrate Tissot’s 100th anniversary. Omega and radar the wholesaler. THE ARCTIC NAVIGATION SYSTEM – Villemont’s Tribute to Roald Amundsen. Labor Shidi Daytona create Antiquorum auction records. The grain of the leather is left untouched on sell vacheron constantin watches the underside of the replica watches band and is only a lange sohne replica watches marked jaeger lecoultre watches by the omega replica watches U-Boat logo that is burnt into it, To ensure the reading is clear. gucci watches smooth flow smoothly, a small blue balloon on the stainless steel table transferred from the 19, Earl White K diamond earrings (right): leaf replica versace handbags shape, Technical SpecificationsMovementBreitling Caliber 78. Shui replica handbags Table Group.
Are you always vexed about herve leger wearing what kind of dress at a banquet? Herve Leger bandage dress online store eliminates Christian Louboutin your worries. Ladies who is beautiful and noble may choose Herve Leger bandage dress. The herve leger bandage dress dress highlights your perfect feminine body curve. If you wear this dress, it will send out your inherent Hermes Handbag glamour. It is specially designed for you and meets your noble Moncler taste. Wherever you go, you will be the focus. If you haven’t a suitable dress to attend a banquet and want to buy herve leger dresses one now, Herve Leger bandage dress online store is your best choice.
ugg boots on sale ugg boots on sale on sale ugg boots on boots ugg sale ugg on boots sale women boots on sale tall ugg boots sale ugg boots buy boots on sale ugg tall ugg boots sale
8、 UGG Boots Tall Tall Classic UGG Boots Boots Tall UGG UGG Tall Classic Boots Tall Classic UGG Boot woman Classic UGG Boots Tall Classic UGG Boot Tall Classic Boots 3 三个扣子 Button Triplet UGG bailey Boots bailey Button Triplet Boots UGG bailey Button Triplet Boots UGG Triplet bailey Button Boots bailey Button Triplet UGG bailey UGG Button Triplet Boots Button bailey Triplet ugg bailey Button Triplet UGG bailey Button Triplet Boots UGG bailey Button Triplet Boots chestnut bailey button triplet ugg boots bailey button triplet ugg boots chestnut
4、 Cardy Classic UGG UGG Boots Classic Cardy UGG Cardy Boot Boots Cardy UGG Boots Cardy UGG Classic Cardy UGG Classic Boot Cardy UGG Classic
3、长的毛线鞋 Knit Ugg Boots Argyle Boots Argyle Knit Ugg Boots Argyle Knit Argyle Classic Knit Ugg Boots Ugg Classic Argyle Knit Boots Argyle Knit Ugg Boots Knit argle Boots