#205
Mar 15, 2010

Unobtrusive Javascript

Keep JavaScript out of your HTML content with unobtrusive JavaScript. Here I show how Rails 3 works with this best practice.
Download (27.4 MB, 13:18)
alternative download for iPod & Apple TV (17.7 MB, 13:18)

Resources

<!-- ujs_example.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>UJS Example</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" charset="utf-8">
      $(function() {
        $("#alert").click(function() {
          alert(this.getAttribute("data-message"));
          return false;
        })
      })
    </script>
  </head>
  <body>
    <h1><a href="#" id="alert" data-message="Hello UJS!">Click Here</a></h1>
  </body>
</html>

<!-- layouts/application.html.erb -->
<%= javascript_include_tag :defaults %>
<!-- or -->
<%= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js", "jquery.rails.js" %>
<%= csrf_meta_tag %>

<!-- products/index.html.erb -->
<% form_tag products_path, :method => :get, :remote => true do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>

<div id="products">
  <%= render @products %>
</div>
// products/index.js.erb
$("products").update("<%= escape_javascript(render(@products)) %>");
// or
$("#products").html("<%= escape_javascript(render(@products)) %>");

RSS Feed for Episode Comments 51 comments

1. George Mar 15, 2010 at 00:02

Thanks Ryan. Keep them coming.


2. Bagwan Pankaj Mar 15, 2010 at 00:14

Thanks.

Keep it up


3. godweed Mar 15, 2010 at 00:47

thanks for your great efforts.


4. Nico Mar 15, 2010 at 00:47

Nice screencast, thanks. I wonder if the rjs stuff is still in rails 3? I'm using it a lot, it simplifies working with javascript quite a bit. For example by making helpers that output js via the update_page function. Is that still supported in rails 3?


5. Romain Tribes Mar 15, 2010 at 01:27

Hello Ryan, like usually, thanks for your work. :)

In the javascript code, why do you use "return false;" instead of "event.preventDefault();" ?

And i have a suggestion for a unobstrusive links with actions methods : the idea is to use the noscript tag to provide a button_to if scripts are disabled and link_to in normal cases.

Of course, the other way is to use only buttons for actions, with nice styles. :)

Sephi-Chan


6. Willem Mar 15, 2010 at 01:48

Thanks, this screencast is much appreciated. I am also wondering about RJS and Rails 3? I have used RJS with much joy in that past and I am hoping that it would still be supported in Rails 3.


7. Mendel Mar 15, 2010 at 01:57

I've made a simple init generator which will download the latest rails.js (jquery) and doing some other stuff: http://github.com/mendelbenjamin/rhj_init

Thanks again Ryan


8. Karim Helal Mar 15, 2010 at 02:01

How do you do it? You always seem to come up with Railscasts that hit exactly what I'm looking for... anyways, thanks for another great tutorial!


9. Danz Mar 15, 2010 at 04:50

Thanks for another great screencast...

I still use Rails 2.3 in Windows OS, and actually not much satisfied...
Does it still functional in older Rails version?


10. Martin Jarvis Mar 15, 2010 at 05:46

What happens if the user is not using a HTML 5 capable browser? I imagine it will be quite a few years until you can assume that all your users have HTML 5.

Great screencast though!

Martin


11. Steve St. Martin Mar 15, 2010 at 06:14

@Nico, @Willem - rails 3 still contains RJS via http://github.com/rails/prototype_legacy_helper and only available for prototype, however nothing prevents you from creating a js.erb view containing the javascript you would like executed

@Romain - event.preventDefault only prevents the browsers default action, returning false stops the event from propogating (including other handlers)

@Martin - the data-* attributes function in all major browsers, however it will not validate as custom attributes are not part of the HTML spec until HTML5


12. Nico Mar 15, 2010 at 06:52

@Steve: So to have a rails helper that outputs js I could e.g. render a js.erb partial in a helper? Is that what you mean? Anyway rjs had some nice functionality. Abstracting away from the actual js using ruby is nice. I liked that...


13. Romain Tribes Mar 15, 2010 at 07:10

@Steve : Ok i see. So in a "real" application it's quite dangerous to use "return false;", no ?


14. Jamie Hill Mar 15, 2010 at 08:09

I still maintain that there should be a "delete" GET action by default similar to how we have "edit" for update. This would allow everything to work without javascript, is this not the whole point in unobtrusive javascript.

I wrote an article back in 2006 outlining why this is a good idea http://thelucid.com/2006/07/26/simply-restful-the-missing-action/


15. Ryan Bates Mar 15, 2010 at 09:22

@Nico, Yes, you can render a js.erb partial if you need to generate JavaScript in a helper.

I rarely find the need to use RJS anymore. It worked well back when I could not stand JavaScript, but jQuery and other frameworks make JavaScript much nicer to work with.

Simple things like JavaScript "if" conditions are very ugly to do with RJS. I encourage you to learn to use JavaScript directly and it will be more flexible.

@Romain, in what way is "return false" dangerous? It basically tells the browser to not follow the "href" part of the link.

@Jamie, I can understand both sides here. In some ways I would like to see a "delete" action be there by default, but the implementation of the confirmation page would be a lot of duplication across controllers.

Certainly Rails could handle the confirmation page behind the scenes but I think that kind of implementation fits better in a plugin. I hope with Rails 3's approach to plugins it will be much nicer to write a plugin which extends "resources" in routes and adds a delete action and view.

I'll post this on your blog post as well which is probably the best place to continue the discussion.


16. Yuval Mar 15, 2010 at 09:26

Thanks for the cast Ryan. I know this comment won't be popular, but I have very mixed feelings about UJS.

I've worked on big ajax-heavy production projects with both prototype helpers and UJS JQuery, and the UJS projects inevitably ended up more obtrusive and convoluted. Mostly because of the sheer quantity of javascript files needed, as well as programatically generating javascript in rails or C# (gross) once you get into more complex tasks.

I'll still give this a try but remain somewhat skeptical.


17. Yuval Mar 15, 2010 at 10:03

Was also wondering if render :update still exists unaltered on the controller side. This is what most of my xhr controller actions look like. There are usually two possible outcomes to any action as well as processing other than simple view generation:

def whatever
   render :update do |page|
      if condition
         some processing
         page.replace_html... or some other rjs action
      else
         show_errors
      end
   end
end

This is vital functionality. Cheers.


18. Ryan Bates Mar 15, 2010 at 10:18

@Yuval, I don't have much experience with large JavaScript code bases so I hesitate to say much here, but the convoluted code might be resolved through better organizing/structuring of the files and functions.

I don't think this is a problem specific to UJS. Any large code base has a high potential to turn into spaghetti code and JavaScript is no exception.

On the other hand, the event driven programming style is somewhat unique with UJS so that may play a part here. I hope others with more experience than I will chime in here.

Regarding your second question. The :update option is RJS and does still exist in Rails 3. See my earlier comment for my opinions on this.


19. Aaron M Mar 15, 2010 at 10:38

I'll have to watch this later. Ryan if you are able to do an episode on converting a simple 2.3.5 app to work in 3.0.0beta, that would be awesome. I've been having trouble trying to do that myself.

Thanks.


20. Steve St. Martin Mar 15, 2010 at 10:59

@Romain, its possible it could bite you, returning false is basically just like calling e.preventDefault() and e.stopPropogation() meaning it will stop the browsers from handling it (example clicking a link will no longer follow it), and it also will prevent the event from bubbling up the DOM.

@Jamie, what your referring to is graceful degradation and not UJS, due to limited time constraints only the later was tackled, its possible it could be addressed in the future.

@Yuval, not sure how UJS further complicated your project, however you mention programmatic generation of JS, which is precisely what the UJS project has changed.

The helpers only generate the data-* attributes and nothing more, the jQuery and Prototype drivers are meant as an easy way of performing common functionality.

It's completely possible, to not include the rails.js file at all and write your own custom behaviors . Also if you dont like the js.erb approach each of the drivers have implemented custom callbacks ( ajax:before, ajax:complete, etc..) that you can hook into along the way $("#myform").live('ajax:complete', function() { ... }); where you could handle the response data in anyway you want (also allowing all your JS to be merged in one file and prevent continuously returning / evaling it from the server.

UJS allows more flexibility if you fall in the 20% of the 80/20 rule there are many ways to accomplish the same goals and the defaults may not always be be best for you but the important thing is that it is now very easy to step away from the golden path when it comes to JS.


21. Casey Mar 15, 2010 at 11:19

Aaron, this might help. http://blog.peepcode.com/tutorials/2010/live-coding-rails-3-upgrade


22. Yuval Mar 15, 2010 at 12:54

Thanks Ryan and Steve for your feedback. Ultimately, I will most likely use the legacy plugin for any production projects that I update from Rails 2.x to 3. There are just too many variables. Down the road, as I work on new projects, I'll definitely have a look at a full UJS implementation. Cheers.


23. Yuval Mar 15, 2010 at 13:02

I really need to complete my thoughts before I post these comments. :)

In the case of an action with more than one outcome (i.e. all of them, if you're doing error handling) would I essentially just move my entire block of RJS logic (posted above) to a correspondingly named js.erb file? Would it still have access to private methods within the controller?


24. Ryan Bates Mar 15, 2010 at 13:26

@Aaron, I plan to do an episode on upgrading a Rails 2 app to Rails 3 later. It will also act as a nice summary of the past Rails 3 episodes.

@Steve, thanks for the detailed responses here and your work on UJS in Rails.

@Yuval, The "js.erb" file acts as a view file, so it would not have access to controller methods. However you can move the methods into a Helper and it will be available in the view.


25. John Mar 15, 2010 at 16:06

What is your opinion on the idea that executing remote received javascript is a bad idea as well and that we should stick to passing xml/json and replace the content in a callback instead?


26. Ryan Bates Mar 15, 2010 at 16:24

@John, I like the convenience of returning JavaScript directly. Running it through JSON adds another layer of complexity that I don't find necessary.

That said, I have little experience with heavy JavaScript applications, so in those cases it may be cleaner to only use JSON responses and keep the logic/behavior all in one place.

The argument reminds me of YAML vs Ruby code for config files. I generally prefer Ruby code for configuration because of the additional power it brings. It works really well as long as that power isn't abused.


27. Michael Kastner Mar 15, 2010 at 22:36

Ryan, thanks a lot for this great introduction into the use of Javascript in Rails 3.

It does seem to me, however, adding custom tags in order to get javascript functionality running, is not _really_ unobstrusive.

At least not, the way I understand unobstrusive.

It is, after all, _extra_ code added for the single and sole purpose of getting your javascript running.

Maybe this sounds too purist. I am aware of the fact, that at some point, you need to set some "hooks" from where the javascript events take off.

To me, it would have seemed a simpler approach, if one could simply use e.g. css classes, which are already available in the code, as markers.

I don't think, I want to go through all my views and add custom markers.

Just my five cents.

Michael Kastner


28. Boblin Mar 16, 2010 at 01:38

Great screencast!

Thank's


29. Ryan Bates Mar 16, 2010 at 09:52

@Michael, I can see your point, especially on "data-remote" because it has no other purpose than to change behavior. In pure UJS the search form would have a "search" id with custom JavaScript to turn it into an AJAX request.

However that does require some custom, application-specific JavaScript which adds an extra step to making a form AJAX in Rails.

I think the aim is finding the benefits of UJS while keeping things as convenient as they were before. Here it is easy to swap out the JavaScript Rails driver which I think is one of the main purposes behind UJS in Rails.


30. Erik St. Martin Mar 16, 2010 at 11:43

@Michael there should be no need to update your views manually, when using the helpers provided to you by rails such as :confirm => "Are you sure?" will add these custom attributes for you.

I understand your point with css classes but with the number of Rails applications out there the chances of clashing with css classes people are already using are high so data- attributes were preferred especially being that this is the standard way of doing things like this in HTML 5.

The other debate with using css classes is for things like confirm, changing button text on submit etc, you can't supply data in the css class for those.

Using the data- attributes allows for a lot of versatility with changing the values inside of them etc without needing to swap css classes which will cause repaints and reflows.

Hope this gives a little more insight into the decision.


31. Erik St. Martin Mar 16, 2010 at 11:48

@Ryan

You are correct. The reason behind most of these decisions were to allow you to easily implement a driver for whatever framework you choose and the data you look for is consistent.

As well as the ability to easily override behavior.

For example:

jQuery users could easily override the confirm event and use a jQueryUI dialog to do the confirmation rather than using the standard javascript confirm box, or you can override some of the ajax events to open/close things like please wait layers, all of this can be done in a matter of minutes by overriding events.

It truly opens up a lot of areas for customization of standard rails behavior with very little effort.


32. marcel Mar 16, 2010 at 12:09

once more a great screencast with exactly the info i need at the moment.
is there also a replacement for the in_place_editing plugin I used with rails 2?
How can i have the in_place_edit function again in rails3 (jquery) ?
many thanks.


33. Ryan Bates Mar 16, 2010 at 13:15

@marcel, I believe many of the official Rails plugins will eventually be upgrade to Rails 3. I assume in_place_edit will, but I recommend asking on the rails-core mailing list. You can probably fork the plugin and contribute to the upgrade as well.


34. DiMarcello Mar 16, 2010 at 14:41

Ryan, thanx for all about rails 3
You renewed my excitement for rails espacially with this one.
I cant wait to start experimenting again.

And indeed the delete link has always been a dumb error in rails, too bad it still is. I already used your previous episode as inspiration for a plugin of mine, you can expect an update for rails 3 soon. Github resource_delete


35. assente Mar 17, 2010 at 02:18

Nice example, as alwais, but what about "observe_field" in UJS?


36. Chris Mar 17, 2010 at 10:28

Keep 'em comin'!


37. Erik St. Martin Mar 17, 2010 at 12:47

@assente

There isn't really a need on the Rails side for observe_field and observe_form anymore so it was deprecated. It is just as much code to setup in your rails helper as to implement yourself in js

You would just use an event listener in your js framework of choice to watch for changes on the form field and perform the ajax call, or whatever action needs to be taken.

As an additional note the way observe_field and observe_form worked prior to rails 3 was inconsistent based on what options you gave it, whether or not it serialized the form, and what value was passed as the query param to your action. Which made the whole idea more complicated then it needed to be. Best to leave it to the developer to slap together some quick js to do the same thing in the same amount of code and intent to be 100% clear.

there is a legacy helper for anyone wanting to still use these pieces in their original form, with inline js.


38. Cassio Mar 18, 2010 at 10:18

What about sortable_elements, for example? In Rails 3 beta it still uses inline javascript. Does anyone knows if this is also likely to change?


39. Erik St. Martin Mar 18, 2010 at 11:11

@Cassio

There are no plans to support sortable_elements outside the legacy helper at this time as different frameworks tackle this differently, the amount of markup that would need to be emitted would take away from the cleanliness of the code.

Sortable Elements are easily tackled with javascript inside your javascript files, or by rendering out the javascript in a js.erb file.


40. andhapp Mar 20, 2010 at 12:56

I might be worng but you do not need to escape html in the view now because of safe_buffer in rails3. Isn't that correct?


41. Paul Apr 02, 2010 at 19:25

Awesome video, Ryan. Thanks a bunch :)


42. discount golf equipment Apr 26, 2010 at 19:44

hi guys, want a high quality life ? yes! you must link the following some usefulthing:
http://www.golfclubs365.com
http://www.golfequipment18.com
there are two <a href="http://www.golfclubs365.com">Golf Clubs</a> stores,include kinds of <a href="http://www.golfequipment18.com">golf equipment</a>,
<a href="http://www.buyinggolfonline.com/">wholesale golf clubs</a>.
<a href="http://www.golfclubs365.com/goods-214-Callaway+Diablo+Edge+Irons.html">Callaway Diablo Edge Irons</a>
<a href="http://www.golfclubs365.com/goods-214-Callaway+Diablo+Edge+Irons.html">Callaway Diablo Irons</a>
<a href="http://www.golfclubs365.com/goods-214-Callaway+Diablo+Edge+Irons.html">Callaway Edge Irons</a>


43. Yannis Apr 29, 2010 at 06:49

Hi Ryan, and thank you so much for your great screencasts!
How does it come that when trying to render a js.erb template, rails3 (beta3) renders it with a text/html content-type (instead of text/javascript)? Am I missing something?
Thanks


44. Bernat May 05, 2010 at 07:34

Very nice thanks!


45. Volker May 28, 2010 at 01:11

Question concerning delete:
How may I perform an "ajax" delete in a list of products.
if attribute: data-method is specified rails.js handleMethod is called, which adds csrf params into a hidden form and form.submit is called. form.submit is nt performed as an ajax request.
Using data-remote instead of data-method would nt add csrf params.

What s the best approach to achieve that?


46. Matrimonio Mixto Jun 15, 2010 at 19:22

thank you, great job again.


47. Erix Jun 23, 2010 at 23:14

Hi,

Why is it that I can submit a form only once?

I think it's because the security_tags aren't update, but I don't know how to get around that.

Any advice?

Thank you


48. cheap wholesale Jun 23, 2010 at 23:43

I have used RJS with much joy in that past and I am hoping that it would still be supported in Rails 3.


49. coach handbag Jun 29, 2010 at 13:13

Marc Jacobs handbag handbag,and wallet RL Polo,Gucci, Coach wallet, Edhardy wallet, Louis Vuitton wallet.pls contact us or vist our site,For example, women care much more about their purse. so They would like to buy it on net,there are many cheaper item on China handbag http://www.sky-fashion.net


50. Neodymium Magnets Jul 05, 2010 at 23:13

your daily life.You can go those
sits to know more relate things.They are strongly recommended by friends.Personally


51. strapping machine Jul 06, 2010 at 23:31

Thanks for sharing the information.It is definitely going to help me some time.


52. shrink wrap Jul 06, 2010 at 23:32

This is my first time i visit here. I found so many entertaining stuff in your blog, especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here! Keep up the excellent work.


53. cheap wholesale Jul 07, 2010 at 19:58

Thanks Ryan.


54. welding rod Jul 08, 2010 at 18:08

this was a really quality post.I wasn't aware of the many ripples and depth to this story until I surfed here through Google! Great job.


55. welding electrode Jul 08, 2010 at 18:17

I remember I tried this a while ago. It brings back bad memories. Nothing good seems to happen the first time. How long did it take you? I look forward to your next story.


56. jiaoliang Jul 10, 2010 at 02:48

Thank you very much.


57. adidas outlet Jul 10, 2010 at 02:50

How did you know that?


58. hermesbirkins Jul 12, 2010 at 03:16

Money can`t buy Happiness? Whoever said that doesn`t know where to buy.
Buyhermesbirkin offers the high quality Hermes bags and services.
No matter it is the classic Birkin bag, or the Kelly and Lindy bag,
or the latest new designs, you can find them here. Just selecting one,
you will be the next Victoria in the street. – Comes from Shuna Sun


60. Download de programas e jogos Jul 19, 2010 at 01:40

Thank you.I hope I can improve through learning this respect. But overall, it's very nice. Thank you for your share!


60. Entourage DVD set Jul 21, 2010 at 00:11

hi guys,why not try some medium,YES! high quality life needs it, i suppose you are a crazy movie lover like me:p, there are some wonderful DVD movie i really love and want to share with you. if you want some wonderful DVD movies such as Queer As Folk DVD, Entourage DVD, Boston legal DVD .... just go to http://stardvdcity.com i found. it's great!
http://stardvdcity.com
pass it? Never!


61. Queer as folk DVD set Jul 21, 2010 at 00:14

hi guys,why not try some medium,YES! high quality life needs it, i suppose you are a crazy movie lover like me:p, there are some wonderful DVD movie i really love and want to share with you. if you want some wonderful DVD movies such as Queer As Folk DVD, Entourage DVD, Boston legal DVD .... just go to http://stardvdcity.com i found. it's great!
http://stardvdcity.com
pass it? Never!


62. Boston legal DVD set Jul 21, 2010 at 00:16

hi guys,why not try some medium,YES! high quality life needs it, i suppose you are a crazy movie lover like me:p, there are some wonderful DVD movie i really love and want to share with you. if you want some wonderful DVD movies such as Queer As Folk DVD, Entourage DVD, Boston legal DVD .... just go to http://stardvdcity.com i found. it's great!
http://stardvdcity.com
pass it? Never!


63. Boston legal DVD set Jul 21, 2010 at 00:16

hi guys,why not try some medium,YES! high quality life needs it, i suppose you are a crazy movie lover like me:p, there are some wonderful DVD movie i really love and want to share with you. if you want some wonderful DVD movies such as Queer As Folk DVD, Entourage DVD, Boston legal DVD .... just go to http://stardvdcity.com i found. it's great!
http://stardvdcity.com
pass it? Never!


64. coachhandbags Jul 21, 2010 at 20:19

The first Coach outlet stores opened fifty years ago by a sports fan. He noticed how baseball gloves softened with age and became more soft over time than when they were new. And he wondered why women's handbags, men's valises couldn't be made similarly that they, too, became more lustrous and supple over time. Coach line of products have become popular with every passing year.
Our store sells the latest [url=http://www.coachhandbagstrade.com/cocash_big77.html/][b]Coach Purses[/b][/url], [url=http://www.coachhandbagstrade.com/][b]Coach Handbags[/b][/url], [url=http://www.coachhandbagstrade.com/cocash_big74.html/][b]Coach Op Art Bags[/b][/url], [url=http://www.coachhandbagstrade.com/][b]Coach outlet[/b][/url]. We offer Free Shipping for all order by UPS,EMS express and so on, you can track your order on the website when we send out your order .

Website: www.coachhandbagstrade.com
Email:bag139@hotmail.com
MSN:bag139@hotmail.com


65. ankara eskort Jul 24, 2010 at 05:33

Thanks a lot for sharing.


68. asics shose Jul 27, 2010 at 20:14

Article is very nicely written and I am happy to find so many useful information here in the post, thanks for sharing it here. I hope you will adding more.


68. tiffany Earrings Aug 03, 2010 at 20:55

What about sortable_elements, for example? In Rails 3 beta it still uses inline javascript. Does anyone knows if this is also likely to change?


69. discount uggs Aug 08, 2010 at 01:15

Article is very nicely written and I am happy to find so many useful information here in the post, thanks for sharing it here. I hope you will adding more.


70. sanitary ware Aug 08, 2010 at 01:49

Yuyao Huaneng sanitary ware factory is specialized in production of plumbing fittings. 'Aige' sanitary ware series are well received not only by supporting factories but also customers both at home and abroad. The products are well sold at home and exported to the world as well.


71. UGG Boots on sale Aug 10, 2010 at 18:49

Gooooooooooooooooooood luck ~~!!


72. replica jerseys Aug 11, 2010 at 05:57

Thank you.I hope I can improve through learning this respect. But overall, it's very nice. Thank you for your share!


73. free directory list Aug 11, 2010 at 22:41

Keep the Rails 3 intro-casts coming, Ryan! Super great stuff.


74. watch the town online Aug 14, 2010 at 05:58

Thank you.I hope I can improve through learning this respect. But overall, it's very nice. Thank you for your share!


75. Rip Blu-ray for Mac Aug 18, 2010 at 01:41

Thanks,it's so good.
suport!


76. AVI to iPad Aug 19, 2010 at 00:56

This was really useful.


77. Closet Doors Aug 20, 2010 at 07:13

Wow.... Thank again


78. sliding closet doors Aug 20, 2010 at 07:14

I like your blogs.


79. Wholesale baseball hats Aug 20, 2010 at 19:52

These are wonderful! Thank you for finding and sharing


80. Wholesale baseball hats Aug 20, 2010 at 20:09

That is an awfully astounding column you've posted.Thanks a lot for that a fantastically amazing post!


81. converse all star Aug 20, 2010 at 20:50

love converse all star,love yourself.High quality low price.It's fit for you.


82. nike dunks low Aug 23, 2010 at 23:00

Useful and nice episode! High quality low price.It's fit for you. Thanks MattR for sharing that. And thanks Ryan for this great screencast.


83. christian louboutin decollete Aug 25, 2010 at 00:41

That is a idea, I am agree with the opinions of this articles about


84. Wholesale Electronics Aug 25, 2010 at 00:52

Discount Wholesale Electronics, Wholesale Cell Phones, Electronic Gadgets and More from the Best Dropship Wholesaler


85. louis vuitton shoes Aug 26, 2010 at 23:14

Thanks for sharing your article. I really enjoyed it. I put a link to my site to here so other people can read it. My readers have about the same interets


86. rap Aug 29, 2010 at 08:57

I like your blogs


87. eztoo Aug 29, 2010 at 18:20

Try our products. There will be surprises.
http://www.eztoosoft.com


88. eztoo Aug 30, 2010 at 17:19

Try our products. There will be surprises.
http://www.eztoosoft.com


89. herve leger dress Aug 30, 2010 at 19:43

Yuyao Huaneng sanitary ware factory is specialized in production of plumbing fittings.


90. snow boots Aug 30, 2010 at 20:26

For example by making helpers that output js via the update_page function. Is that still supported in rails 3?


91. blu ray ripper Sep 02, 2010 at 00:14

This is really a nice guide for Newbies like me. Thank you.

Add your comment:

(SKIP THIS ONE)

(required)

(not shown)


(use pastie or gist for code)

sponsored by:
if you want to help:
required:
Get Quicktime Player
Give Back to Open Source