validates :rails_3, :awesome => true

Sun Jan 31 12:17:00 -0800 2010

The new validation methods in Rails 3.0 have been extracted out to Active Model, but in the process have been sprinkled with DRY goodness…

As you would know from Yehuda’s post on Active Model abstraction, in Rails 3.0, Active Record now mixes in many aspects of Active Model, including the validates modules.

Before we get started though, your old friends still exist:

  • validates_acceptance_of
  • validates_associated
  • validates_confirmation_of
  • validates_each
  • validates_exclusion_of
  • validates_format_of
  • validates_inclusion_of
  • validates_length_of
  • validates_numericality_of
  • validates_presence_of
  • validates_size_of
  • validates_uniqueness_of

Are still around and not going anywhere, but Rails version 3 offers you some cool, nay, awesome alternatives:

Introducing the validates method

The Validates method accepts an attribute, followed by a hash of validation options.

Which means you can type something like:

class Person < ActiveRecord::Base
  validates :email, :presence => true
end

The options you can pass in to validates are:

  • :acceptance => Boolean
  • :confirmation => Boolean
  • :exclusion => { :in => Ennumerable }
  • :inclusion => { :in => Ennumerable }
  • :format => { :with => Regexp }
  • :length => { :minimum => Fixnum, maximum => Fixnum, }
  • :numericality => Boolean
  • :presence => Boolean
  • :uniqueness => Boolean

Which gives you a huge range of easily usable, succinct options for your attributes and allows you to place your validations for each attribute in one place.

So for example, if you had to validate name and email, you might do something like this:

# app/models/person.rb
class User < ActiveRecord::Base
  validates :name,  :presence => true, 
                    :length => {:minimum => 1, :maximum => 254}
                   
  validates :email, :presence => true, 
                    :length => {:minimum => 3, :maximum => 254},
                    :uniqueness => true,
                    :format => {:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i}
  
end

This allows us to be able to look at a model and easily see the validations in one spot for each attribute, win for code readability!

Extracting Common Use Cases

However, the :format => {:with => EmailRegexp} is a bit of a drag to retype everywhere, and definitely fits the idea of a reusable validation that we might want to use in other models.

And what if you wanted to use a really impressive Regular Expression that takes more than a few characters to type to show that you know how to Google?

Well, validations can also except a custom validation.

To use this, we first make an email_validator.rb file in Rails.root’s lib directory:

# lib/email_validator.rb
class EmailValidator < ActiveModel::EachValidator

  EmailAddress = begin
    qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
    dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
    atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-' +
      '\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
    quoted_pair = '\\x5c[\\x00-\\x7f]'
    domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
    quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
    domain_ref = atom
    sub_domain = "(?:#{domain_ref}|#{domain_literal})"
    word = "(?:#{atom}|#{quoted_string})"
    domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
    local_part = "#{word}(?:\\x2e#{word})*"
    addr_spec = "#{local_part}\\x40#{domain}"
    pattern = /\A#{addr_spec}\z/
  end

  def validate_each(record, attribute, value)
    unless value =~ EmailAddress
      record.errors[attribute] << (options[:message] || "is not valid") 
    end
  end
  
end

As each file in the lib directory gets loaded automatically by Rails, and as our class inherits from ActiveModel::EachValidator the class name is used to create a dynamic validator that you can then use in any object that makes use of the ActiveModel::Validations mix in, such as Active Record objects.

The name of the dynamic validation option is based on whatever is to the left of “Validator” down-cased and underscorized.

So now in our User class we can simply change it to:

# app/models/person.rb
class User < ActiveRecord::Base
  validates :name,  :presence => true, 
                    :length => {:minimum => 1, :maximum => 254}
                   
  validates :email, :presence => true, 
                    :length => {:minimum => 3, :maximum => 254},
                    :uniqueness => true,
                    :email => true
  
end

Notice the :email => true call? This is much cleaner and simple, and more importantly, reusable.

Now in our console, we will see something like:

 $ ./script/console 
Loading development environment (Rails 3.0.pre)
?> u = User.new(:name => 'Mikel', :email => 'bob')
=> #<User id: nil, name: "Mikel", email: "bob", created_at: nil, updated_at: nil>
>> u.valid?
=> false
>> u.errors
=> #<OrderedHash {:email=>["is not valid"]}>

With our custom error message “is not valid” showing up in the email.

Class Wide Validations

But what if you had, say, three different models, users, visitors and customers, all of which shared some common validations, but were different enough that you had to separate them out?

Well, you could use another custom validator, but pass it to your models as a validates_with call:

# app/models/person.rb
class User < ActiveRecord::Base
  validates_with HumanValidator
end

# app/models/person.rb
class Visitor < ActiveRecord::Base
  validates_with HumanValidator
end

# app/models/person.rb
class Customer < ActiveRecord::Base
  validates_with HumanValidator
end

You could then make a file in your lib directory like so:

class HumanValidator < ActiveModel::Validator

  def validate(record)
    record.errors[:base] << "This person is dead" unless check(human)
  end

  private

    def check(record)
      (record.age < 200) && (record.age > 0)
    end
  
end

Which is an obviously contrived example, but would produce this result in our console:

$ ./script/console 
Loading development environment (Rails 3.0.pre)
>> u = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
>> u.valid?
=> false
>> u.errors
=> #<OrderedHash {:base=>["This person is dead"]}>

Trigger times

As you would expect, any validates method can have the following sub options added to them:

  • :on
  • :if
  • :unless
  • :allow_blank
  • :allow_nil

Each of these can take a call to a method on the record itself. So we could have:

class Person < ActiveRecord::Base
  
  validates :post_code, :presence => true, :unless => :no_postcodes?

  def no_postcodes?
    ['TW'].include?(country_iso)
  end
  
end

I think you can see this gives you a huge amount of flexibility.

Credits

Kudos to Jamie Hill, José Valim and Joshua Peek for getting the patch in.

  1. Sigi Says:

    “true if [‘TW’].include?(country_iso)” is a tautology.

  2. Rohit Arondekar Says:

    :length => { :minimum => Fixnum, maximum => Fixnum, }

    should be,

    :length => { :minimum => Fixnum, :maximum => Fixnum }

  3. franchise opportunity Says:

    The Obama administration has an opportunity to imbue greater momentum to the Paris process, and use those principles to transform its strategy to promote global development and democracy.

  4. vibha Says:

    validates :email, :email => true is really cool.

    What if i want to check the format of another field ‘phone’ which also accepts an regular expression to match (555-555-5555) ?

  5. vibha Says:

    validates :email, :email => true is really cool.

    What if i want to check the format of another field ‘phone’ which also accepts an regular expression to match (555-555-5555) ?

  6. vibha Says:

    validates :email, :email => true is really cool.

    What if i want to check the format of another field ‘phone’ which also accepts an regular expression to match (555-555-5555) ?

  7. Hemali Says:

    really nice post.Thanks for sharing it.

    Rails 3 is gonna rock…

  8. Michael Hartl Says:

    These posts are extremely helpful. It’s hard to know in advance just how Rails 3 apps will differ from the status quo; since many of the changes are subtle, it’s hugely helpful to get an early peek at them. Thanks, and keep up the great work!

  9. Marcelo Silveira Says:

    Thanks for sharing. It’s something I’d like to see in Rails for some time.

  10. gdever Says:

    Very good article. Thanks.

  11. ziljian Says:

    Couldn’t find the case sensitive option mentioned anywhere for the new method. Here’s how it works -

    validates :email,
    {:uniqueness => {:case_sensitive => false}}

  12. Mikel Lindsaar Says:

    @Sigi – thanks, added, @ziljian, cool!

  13. Josef Schmitz Says:

    On using Validation in a non ActiveRecord, at what point of execution is Validation triggered?

  14. Mikel Lindsaar Says:

    @Josef, it isn’t directly, you have to call the valid? method to determine how you want to handle the object being valid or invalid, eg, save or not to the database.

  15. Zachary Says:

    the email regexp doesn’t appear to work with ruby 1.9.2/rails3
    It throws the same thing that someone mentioned earlier for 1.9.1:
    ArgumentError: invalid multibyte escape
    for:
    pattern = /\A#{addr_spec}\z/

    Any ideas?

  16. seokot Says:

    Thank you for the source codes. I did not get any errors except email validation. But I can fix just need some time to get to know it.

  17. Jamie Hill Says:

    Thanks for the writeup, much more in-depth than my brief examples. I’d like to see a lot of this info make it into Rails as a documentation patch as it really explains well the usecase for the validates method.

  18. Zachary Says:

    the email regexp doesn’t appear to work with ruby 1.9.2/rails3
    It throws the same thing that someone mentioned earlier for 1.9.1:
    ArgumentError: invalid multibyte escape
    for:
    pattern = /\A#{addr_spec}\z/

    Any ideas?

  19. Zachary Says:

    Update – the issue with:
    ArgumentError: invalid multibyte escape that had to do with email_validator.rb can be resolved if you add the following to the top:

    1. encoding: binary
  20. Zachary Says:

    Update – the issue with:
    ArgumentError: invalid multibyte escape that had to do with email_validator.rb can be resolved if you add the following to the top:

    1. encoding: binary
  21. Owen Dall Says:

    Sweet…

  22. haosd Says:

    visitors and customers, all of which shared some common validations, but were different enough that you had to separate them out?

  23. Caleb Says:

    I am trying to create a validation that will make sure a specific column in a record matches the same value when you submit the updates as it did when you requested the record from the database. How would I do this?

  24. Caleb Says:

    I am trying to create a validation that will make sure a specific column in a record matches the same value when you submit the updates as it did when you requested the record from the database. How would I do this?

  25. Caleb Says:

    I am trying to create a validation that will make sure a specific column in a record matches the same value when you submit the updates as it did when you requested the record from the database. How would I do this?

  26. Jones Lee85 Says:

    I got this

    validates_numericality_of :quantity, :only_integer => true, :message => I18n.t(“validation.must_be_int”)

    and I converted it to

    validates :quantity, :numericality => true, :only_integer => true, :message => I18n.t(“validation.must_be_int”)

    but rails3 complain that no only_integer method found, can someone help?

  27. Nick Clark Says:

    @jones Lee85

    try:
    validates :quantity, :numericality => {:only_integer => true, :message => I18n.t(“validation.must_be_int”)}

  28. Emil Kampp Says:

    I’m getting this error, when implementing your suggestion for an email-validation:

    ArgumentError: invalid multibyte escape

    And this occurs on line 17 in the email_validator.rb file. This is unfortunately not the first problem I have had with encoding in rails3 beta4. Does anybody have any suggestions?

    Best regards.

  29. Jones Lee Says:

    What is the rails3 version of validates_associated?

  30. Ian Alexander Wood Says:

    Just a quick update on this excellent post.

    Early beta versions of Rails 3 automatically included all files placed in the Rails.root/lib directory. This is no longer the case with later Rails 3 release candidates or 3.0.0

    If you want to automatically load all extra files in Rails.root/lib you will need to add this line to Rails.root/config/application.rb:

    config.autoload_paths += %W(#{Rails.root}/lib)

  31. Kristian Mandrup Says:

    Looks nice, but I’d still like some more flexibility ;)
    email => true seems a bit limited to me. Why not
    email => {…} and the options hash would be available inside the validator simply as options.
    If email => true or a hash, it should take effect.

    I need this functionality fx for a name validator, where I will have the regexp inside the validator but would like to pass options as to how long it should be, case sensitivity etc. without being constrained to those options built-in.

  32. sauna Says:

    Very good article. Beware of appearances, but I found this article excellent. This site is a real source of useful information. Thank you very much for the work provided. I hope you will continue long

  33. payday loan consolidation companies Says:

    You certainly deserve a round of applause for your post and more specifically, your blog in general. Very high quality material Thank you for this valuable post. It changed my Thank you for this valuable post. It changed my policy
    payday loan consolidation companies

  34. payday loan consolidation companies Says:

    You certainly deserve a round of applause for your post and more specifically, your blog in general. Very high quality material Thank you for this valuable post. It changed my Thank you for this valuable post. It changed my policy
    payday loan consolidation companies

  35. payday loan consolidation companies Says:

    You certainly deserve a round of applause for your post and more specifically, your blog in general. Very high quality material Thank you for this valuable post. It changed my Thank you for this valuable post. It changed my policy

  36. payday loan consolidation companies Says:

    You certainly deserve a round of applause for your post and more specifically, your blog in general. Very high quality material Thank you for this valuable post. It changed my Thank you for this valuable post. It changed my policy

  37. Jaime Bellmyer Says:

    Thanks for a great article, I learned a lot :) I do have one tip for you: “validates :email, :email => true” doesn’t show the intent as clearly as it could. Its purpose is a mystery to someone reading the code until they take the time to trace it back to the custom validator. I can see this being something I’d write myself, then scratch my head 3 months later when I read it again :)

    I’d suggest changing the custom validator’s class name to FormattedAsEmailValidator, and using the corresponding call in the validation itself. I think this is much more readable:

    validates :email, :formatted_as_email => true

    I don’t agree with the suggestion above to move the regex itself into the validation line – I think that defeats the purpose of having one, standard definition of an e-mail format for the entire application. But I think they might have been wrestling with the “expressiveness” of the syntax as well.

    Thanks again!

  38. latest news today Says:

    Great information you’ve provided us with here. Thanks so much for sharing. Nice site too..

  39. latest news today Says:

    Great information you’ve provided us with here. Thanks so much for sharing. Nice site too..

  40. Heart Attack Symptoms Says:

    Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.

  41. Heart Attack Symptoms Says:

    Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.

  42. Heart Attack Symptoms Says:

    Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.

  43. Martin Harrigan Says:

    In your HumanValidator, I think check(human) should be check(record).

  44. biomedical engineering salary Says:

    Great bit “O” snippets, handy for the tool chest you know, thanka mate! Cheers!

  45. biomedical engineering salary Says:

    Great bit “O” snippets, handy for the tool chest you know, thanka mate! Cheers!

  46. biomedical engineering salary Says:

    Great bit “O” snippets, handy for the tool chest you know, thanka mate! Cheers!

  47. dallas website design Says:

    Great concepts on this page. It’s rare these days to find websites with info you are searching. I am glad I discovered this webpage. I can actually bookmark it or perhaps subscribe to your rss feeds just to get your new posts. Carry on the nice work and I’m certain some other people researching valued information will definitely stop by and use your site for resources.

  48. dallas website design Says:

    Great concepts on this page. It’s rare these days to find websites with info you are searching. I am glad I discovered this webpage. I can actually bookmark it or perhaps subscribe to your rss feeds just to get your new posts. Carry on the nice work and I’m certain some other people researching valued information will definitely stop by and use your site for resources.

  49. Jackson Says:

    If “Unknown validator:” error
    Probably need to put validator in app/validators

  50. Michael Prins Says:

    I found that the Regexp above didn’t work for me even after fixing encoding issues. The following (which is also used in Devise) did the trick for me (I hope it somewhat survives the formatting).

    EMAIL_ADDRESS_QTEXT = Regexp.new ‘[^\\x0d\\x22\\x5c\\x80-\\xff]’, nil, ‘n’
    EMAIL_ADDRESS_DTEXT = Regexp.new ‘[^\\x0d\\x5b-\\x5d\\x80-\\xff]’, nil, ‘n’
    EMAIL_ADDRESS_ATOM = Regexp.new ‘[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+’, nil, ‘n’
    EMAIL_ADDRESS_QUOTED_PAIR = Regexp.new ‘\\x5c[\\x00-\\x7f]’, nil, ‘n’
    EMAIL_ADDRESS_DOMAIN_LITERAL = Regexp.new “\\x5b(?:#{EMAIL_ADDRESS_DTEXT}|#{EMAIL_ADDRESS_QUOTED_PAIR})*\\x5d”, nil, ‘n’
    EMAIL_ADDRESS_QUOTED_STRING = Regexp.new “\\x22(?:#{EMAIL_ADDRESS_QTEXT}|#{EMAIL_ADDRESS_QUOTED_PAIR})*\\x22”, nil, ‘n’
    EMAIL_ADDRESS_DOMAIN_REF = EMAIL_ADDRESS_ATOM
    EMAIL_ADDRESS_SUB_DOMAIN = “(?:#{EMAIL_ADDRESS_DOMAIN_REF}|#{EMAIL_ADDRESS_DOMAIN_LITERAL})”
    EMAIL_ADDRESS_WORD = “(?:#{EMAIL_ADDRESS_ATOM}|#{EMAIL_ADDRESS_QUOTED_STRING})”
    EMAIL_ADDRESS_DOMAIN = “#{EMAIL_ADDRESS_SUB_DOMAIN}(?:\\x2e#{EMAIL_ADDRESS_SUB_DOMAIN})*”
    EMAIL_ADDRESS_LOCAL_PART = “#{EMAIL_ADDRESS_WORD}(?:\\x2e#{EMAIL_ADDRESS_WORD})*”
    EMAIL_ADDRESS_SPEC = “#{EMAIL_ADDRESS_LOCAL_PART}\\x40#{EMAIL_ADDRESS_DOMAIN}”
    EMAIL_ADDRESS_PATTERN = Regexp.new “#{EMAIL_ADDRESS_SPEC}”, nil, ‘n’
    EMAIL_ADDRESS_EXACT_PATTERN = Regexp.new “\\A#{EMAIL_ADDRESS_SPEC}\\z”, nil, ‘n’

  51. dallas website design Says:

    Great concepts on this page. It’s rare these days to find websites with info you are searching. I am glad I discovered this webpage. I can actually bookmark it or perhaps subscribe to your rss feeds just to get your new posts.

  52. Mac Martine Says:

    This seems to consider ‘mydomain@com’ valid, even though there is no ‘.’

  53. dallas website design Says:

    I have to agree with those who praised the blog post above. I really enjoyed it and it made me quite curious to see what we are going to see or get on this website in the future, it’s exciting for me.

  54. dallas website design Says:

    I have to agree with those who praised the blog post above. I really enjoyed it and it made me quite curious to see what we are going to see or get on this website in the future, it’s exciting for me.

  55. Claim for your injury Says:

    They have made sure to make this a very nasty and time consuming process for the home user.

  56. Orlando Digital Agency Says:

    version 3 offers you some cool, nay, awesome alternatives:

  57. магазин ювелирных изделий Says:

    Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.

  58. магазин ювелирных изделий Says:

    Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.

  59. iPhone Spy Says:

    interesting to read this great article indeed because I have known many great and new things from you. Thanks a lot one more time.

  60. Aluminum Wallet Says:

    I will get to know more new information. Even the website layouts and the designs impress me a lot.
    It’s very useful and grateful for the article .

  61. Dicas de Presentes Criativas Says:

    it was an amazing tip I’ll try it on my site, Now I think I can implement and validate this. sorry for my bad english.

  62. online rubbellose Says:

    The evaluation of this data has proven very handy in identifying certain problems. Thanks for the help.

  63. online rubbellose Says:

    The evaluation of this data has proven very handy in identifying certain problems. Thanks for the help.

  64. John Says:

    This article – indeed the whole website – has been a blessing for me to find. I am finding so many answers for questions that have plagued me for so long.

  65. Free Cell Phone Spy Says:

    I am certainly thankful to you for providing us with this invaluable info. My spouse and I are truthfully grateful, precisely the computer data we needed…

  66. Free Cell Phone Spy Says:

    I am certainly thankful to you for providing us with this invaluable info. My spouse and I are truthfully grateful, precisely the computer data we needed…

  67. Hiking Says:

    This one was really extracting and cool as always.

    shean06

  68. buy glasses online Says:

    On the part of my friends in the college, wish to express the thanks for the truly stunning secrets revealed via your article. Your clear explanation brought comfort and optimism to all of us and might really help us in a research we are at this time doing. I think if still come across web-sites like yours, our stay in college will be an easy one. Thank you

  69. jak poderwac dziewczyne Says:

    thanks for explaining the validate method, I have some trouble with it but I’m starting to understand it better now…

  70. jak poderwac dziewczyne Says:

    thanks for explaining the validate method, I have some trouble with it but I’m starting to understand it better now…

  71. payday loans Says:

    I really like using Rail because its such an awesome and versatile coding language.

  72. speedo aquabeat Says:

    I can definitely confirm this…

  73. Peanut Machine Says:

    This was a fantastic post. Really loved reading your weblog post. The information was very informative and helpful.

  74. Manufacturer Directory Says:

    Its’ not easy to post something different on such kind of topics but you made it totally easy. I love your way of describing something.

  75. seo Says:

    which also accepts an regular expression to match if i want to check the format of another field ‘phone’

  76. Pręty stalowe Says:

    Fantastic information, this great post – thanks so much

  77. St Lucia Villas Says:

    thankful to you for providing us with this invaluable info. My spouse and I are truthfully grateful, precisely the computer data we needed…

  78. Yoga Retreat Says:

    Which gives you a huge range of easily usable, succinct options for your attributes and allows you to place your validations for each attribute in one place.

  79. St Lucia Luxury Holidays Says:

    visitors and customers, all of which shared some common validations, but were different enough that you had to separate them out?

  80. Marketing Says:

    I are truthfully grateful, precisely the computer data we needed…

  81. carpets los angeles Says:

    Well, validations can also except a custom validation.

  82. Igrice Says:

    thanks for explaining the validate method, I have some trouble with it but I’m starting to understand it better now…

  83. Igrice Says:

    thanks for explaining the validate method, I have some trouble with it but I’m starting to understand it better now…

  84. los angeles criminal defense lawyer Says:

    This type of “archaeology of the future” enables service providers to make early qualitative judgments about the implications of a design.

  85. loans Says:

    I don`t get it: what is the true meaning of this website?

  86. datingsites Says:

    hell yes… I have reached the maximum post limit.

  87. Los Angeles Delivery Service Says:

    I love its culture,the sakura trees,the manga,the anime,the kimono,the beauty…i would like to know more about Japan from an native Japanese person

  88. canada goose jacket sale Says:

    After reading, and benefited a lot

  89. canada goose jacket sale Says:

    After reading, and benefited a lot

  90. x ray tech Says:

    Which gives you a huge range of easily usable, succinct options for your attributes and allows you to place your validations for each attribute in one place.

  91. EPOS Cheshire Says:

    Thanks for making such a killer blog. I arrive on here all the time and am floored with the fresh information here!

  92. linkboostup Says:

    Nice review of the topic , I was looking to understand this matter further and found this information to be informative.

  93. candy gift baskets Says:

    I am still using the old code, I wanna try this but I am not sure if I can revert it back.

  94. candy gift baskets Says:

    I am still using the old code, I wanna try this but I am not sure if I can revert it back.

  95. android spy Says:

    I Think this Code in use Setting up Mobile Phone Apps this is why you blog is so valued

  96. Kodulehe disiain Says:

    This new method is really good. Thanks

  97. Konverentsiruumid Says:

    This method is really good. I have been using it too

  98. Online Fast Food Says:

    I did not get any errors except email validation. But I can fix just need some time to get to know it.

  99. Refinance Quote Says:

    I will try to use your tips on my future projects. I am sure that I will have excellent results.

  100. Scot Wetherington Says:

    Your article is very good, I like it very much.

  101. Tow Dolly Says:

    When Ive heard about this issue, I suddenly found a book/paperback that showcase this topic very clearly. I may recommend you to buy it too. Just PM me then. Thanks in advance

    Mike
    Tow Dolly

  102. Healthy Lifestyle Says:

    I really loved reading your blog. It was very well authored and easy to undertand. Unlike additional blogs I have read which are really not tht good. I also found your posts very interesting. In fact after reading, I had to go show it to my friend and he ejoyed it as well!

  103. Healthy Lifestyle Says:

    I really loved reading your blog. It was very well authored and easy to undertand. Unlike additional blogs I have read which are really not tht good. I also found your posts very interesting. In fact after reading, I had to go show it to my friend and he ejoyed it as well!

  104. clubmz reviews Says:

    Excelelnt to know of this blog. I am really enjoying reading your well written articles.
    It looks like you spend a lot of effort and time on your blog. I have bookmarked it and I am looking forward to reading new articles.
    Keep up the good work!

  105. free hook up sites Says:

    continue the work

  106. Google Plus 1 Service Says:

    A perfect info source. Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic

  107. Online Business Directory Says:

    Nice post,not like some boring once,i definitely loved every little bit of it! Thanks for posting.

  108. Premium Web Directory Says:

    Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.

  109. Anabolika kaufen Says:

    Please add more good information that would help others in such good way.

  110. Faltdisplay Says:

    I love Rails 3 and personally use it almost every day!

  111. skin resurfacing Perth Says:

    Excellent posts to read keep it up and keep going on this way. And keep sharing these types of things Thanks and I read your article and I keep reading your content.. It’s very interesting..

  112. Judy Antler Says:

    Does rails 3.0 intergrate with any version of the software? It looks suberb!

  113. freelance django developer Says:

    I was looking to understand this matter further and found this information to be informative.

  114. gratisproben zigaretten Says:

    Great website, I love this article, it’s very well researched.

  115. Holiday Compensation Claims Says:

    I really enjoyed it and it made me quite curious to see what we are going to see or get on this website in the future, it’s exciting for me.

  116. click here Says:

    Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.

  117. read more Says:

    Thanks for the writeup, much more in-depth than my brief examples. I’d like to see a lot of this info make it into Rails as a documentation patch as it really explains well the usecase for the validates method.

  118. Cheap laser fax Says:

    I find the information posted here is very useful. Thanks for sharing them.

  119. white one shoulder dress Says:

    I am glad I discovered this webpage. I can actually bookmark it or perhaps subscribe to your rss feeds just to get your new posts.

  120. Crescent Processing Company Says:

    Thanks for this informative post. It help me a lot. And it gave mo ideas on how to make more money in marketing business. I hope lots of people visit this site so they can easily learn this informative post.

  121. Crescent Processing Company Says:

    I think I am quite anxious about this technical meeting and I want to know the feedback of this meeting.I am sure it will be an extremely informative one and all those will attend it will be quite beneficial.

  122. gossip girl quotes Says:
    I have read so many blogs are all different writing, different objectives,But I read your blog, you got the message by writing a good blog which I did very much to you,
  123. Aeronaves Says:

    There are many people searching about that now they will find enough resources by your post.

  124. zero energy design Says:

    which also accepts an regular expression to match if i want to check the format of another field ‘phone’
    There are many people searching about that now they will find enough resources by your post.
    I have read so many blogs are all different writing, different objectives,But I read your blog, you got the message by writing a good blog which I did very much to you,

  125. sconce wall lights Says:

    Crawl Space Encapsulation processes are done at home to close all vents and outlets. Involve closing all openings in an airtight vessel is a medium-good quality plastic. This helps in keeping the moisture from the filter through the cracks. You can hire a contractor to get it done on sealing your home. He can take the help of a crawl space dehumidifier to achieve the task. This facilitates the depletion of the remaining moisture in your home or wet areas due to water leakage.

  126. Business Directory Says:

    First of all i would like to thank you for the great and informative entry. I have to admit that I have never heard about this information I have noticed many new facts for me. I would like to thank Essay Samples for helping me in my studies. Without…

  127. sconce wall lights Says:

    Crawl Space Encapsulation processes are done at home to close all vents and outlets. Involve closing all openings in an airtight vessel is a medium-good quality plastic. This helps in keeping the moisture from the filter through the cracks. You can hire a contractor to get it done on sealing your home. He can take the help of a crawl space dehumidifier to achieve the task. This facilitates the depletion of the remaining moisture in your home or wet areas due to water leakage.

  128. best online cash advance Says:

    I really enjoyed it and it made me quite curious to see what we are going to see or get on this website in the future, it’s exciting for me.

  129. War Games Says:

    This facilitates the depletion of the remaining moisture in your home or wet areas due to water leakage.

  130. vietnam holidays Says:

    That is a good idea to know the solution for this different ideas. Thanks.

  131. vietnam vacation Says:

    it seems to be new to me when mentioning about those different views.

  132. Mars Says:

    This helps in keeping the moisture from the filter through the cracks. You can hire a contractor to get it done on sealing your home.

  133. vietnam travel Says:

    That is a good view for different ideas. I will keep this for new update about the validate rail.

  134. cong ty tham tu Says:

    This is a great method to heal some bad diseases. Nice treatment.

  135. cong ty tham tu Says:

    This is a great method to heal some bad diseases. Nice treatment.

  136. forbrukslån Says:

    The evaluation of this data has proven very handy in identifying certain problems. Thanks for the help.

  137. Schlafzimmer komplett  Says:

    There are many people searching about that now they will find enough resources by your post.

  138. kleinkredit Says:

    I am certainly thankful to you for providing us with this invaluable info. My spouse and I are truthfully grateful, precisely the computer data we needed…

  139. best cigarettes Says:

    This was a fantastic post. Really loved reading your weblog post. The information was very informative and helpful.

  140. best cigarettes Says:

    This was a fantastic post. Really loved reading your weblog post. The information was very informative and helpful.

Leave a Reply