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.




Sun Feb 07 05:58:55 -0800 2010
“true if [‘TW’].include?(country_iso)” is a tautology.
Thu May 13 21:59:44 -0700 2010
:length => { :minimum => Fixnum, maximum => Fixnum, }
should be,
:length => { :minimum => Fixnum, :maximum => Fixnum }
Sat Nov 05 23:58:39 -0700 2011
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.
Tue May 18 03:57:50 -0700 2010
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) ?
Tue May 18 03:58:05 -0700 2010
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) ?
Tue May 18 03:58:39 -0700 2010
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) ?
Mon Feb 01 03:28:04 -0800 2010
really nice post.Thanks for sharing it.
Rails 3 is gonna rock…
Sun Jan 31 15:41:23 -0800 2010
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!
Mon Feb 01 18:19:40 -0800 2010
Thanks for sharing. It’s something I’d like to see in Rails for some time.
Tue Feb 02 11:00:10 -0800 2010
Very good article. Thanks.
Sat Feb 13 06:06:40 -0800 2010
Couldn’t find the case sensitive option mentioned anywhere for the new method. Here’s how it works -
validates :email,
{:uniqueness => {:case_sensitive => false}}
Mon Feb 15 17:26:50 -0800 2010
@Sigi – thanks, added, @ziljian, cool!
Fri Feb 19 02:21:50 -0800 2010
On using Validation in a non ActiveRecord, at what point of execution is Validation triggered?
Fri Feb 19 07:33:00 -0800 2010
@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.
Wed Oct 13 15:43:46 -0700 2010
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?
Thu Oct 14 01:48:57 -0700 2010
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.
Mon Mar 15 02:48:47 -0700 2010
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.
Wed Oct 13 15:46:46 -0700 2010
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?
Wed Oct 13 16:40:23 -0700 2010
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:
Wed Oct 13 16:40:50 -0700 2010
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:
Tue Mar 23 16:03:36 -0700 2010
Sweet…
Tue Nov 08 19:55:40 -0800 2011
visitors and customers, all of which shared some common validations, but were different enough that you had to separate them out?
Sun Nov 07 20:13:19 -0800 2010
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?
Sun Nov 07 20:13:32 -0800 2010
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?
Sun Nov 07 20:13:48 -0800 2010
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?
Thu Jun 17 19:38:50 -0700 2010
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?
Sun Jun 20 13:06:07 -0700 2010
@jones Lee85
try:
validates :quantity, :numericality => {:only_integer => true, :message => I18n.t(“validation.must_be_int”)}
Sun Jul 11 13:04:34 -0700 2010
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.
Mon Jul 12 08:14:25 -0700 2010
What is the rails3 version of validates_associated?
Tue Aug 31 21:16:20 -0700 2010
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)
Thu Dec 23 06:46:01 -0800 2010
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.
Sun Jan 16 05:15:55 -0800 2011
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
Fri Nov 11 01:31:07 -0800 2011
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
Fri Nov 11 01:31:31 -0800 2011
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
Fri Nov 11 01:31:44 -0800 2011
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
Fri Nov 11 01:31:57 -0800 2011
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
Tue Mar 15 11:52:37 -0700 2011
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!
Sat Nov 12 10:50:06 -0800 2011
Great information you’ve provided us with here. Thanks so much for sharing. Nice site too..
Sat Nov 12 10:50:26 -0800 2011
Great information you’ve provided us with here. Thanks so much for sharing. Nice site too..
Sun Nov 13 20:39:02 -0800 2011
Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.
Sun Nov 13 20:39:28 -0800 2011
Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.
Sun Nov 13 20:39:50 -0800 2011
Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.
Wed Apr 20 01:54:20 -0700 2011
In your HumanValidator, I think check(human) should be check(record).
Tue Nov 15 11:08:00 -0800 2011
Great bit “O” snippets, handy for the tool chest you know, thanka mate! Cheers!
Tue Nov 15 11:08:22 -0800 2011
Great bit “O” snippets, handy for the tool chest you know, thanka mate! Cheers!
Tue Nov 15 11:07:35 -0800 2011
Great bit “O” snippets, handy for the tool chest you know, thanka mate! Cheers!
Tue Nov 15 19:05:40 -0800 2011
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.
Tue Nov 15 19:06:06 -0800 2011
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.
Fri Jun 10 16:52:37 -0700 2011
If “Unknown validator:” error
Probably need to put validator in app/validators
Tue Jun 14 14:02:42 -0700 2011
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’
Tue Nov 15 19:08:54 -0800 2011
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.
Thu Jun 23 11:20:08 -0700 2011
This seems to consider ‘mydomain@com’ valid, even though there is no ‘.’
Wed Nov 16 19:14:51 -0800 2011
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.
Wed Nov 16 19:16:06 -0800 2011
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.
Sat Dec 10 04:49:39 -0800 2011
They have made sure to make this a very nasty and time consuming process for the home user.
Sat Nov 19 19:19:25 -0800 2011
version 3 offers you some cool, nay, awesome alternatives:
Mon Dec 12 02:04:34 -0800 2011
Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.
Mon Dec 12 02:04:55 -0800 2011
Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.
Tue Nov 22 00:26:29 -0800 2011
interesting to read this great article indeed because I have known many great and new things from you. Thanks a lot one more time.
Mon Aug 08 01:46:35 -0700 2011
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 .
Thu Nov 24 04:46:44 -0800 2011
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.
Thu Nov 24 10:29:37 -0800 2011
The evaluation of this data has proven very handy in identifying certain problems. Thanks for the help.
Thu Nov 24 10:30:24 -0800 2011
The evaluation of this data has proven very handy in identifying certain problems. Thanks for the help.
Wed Sep 07 16:23:56 -0700 2011
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.
Sat Sep 10 00:28:20 -0700 2011
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…
Sat Sep 10 00:28:40 -0700 2011
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…
Thu Sep 15 22:07:03 -0700 2011
This one was really extracting and cool as always.
shean06
Mon Sep 19 10:30:51 -0700 2011
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
Sat Oct 01 16:24:56 -0700 2011
thanks for explaining the validate method, I have some trouble with it but I’m starting to understand it better now…
Sat Oct 01 16:25:26 -0700 2011
thanks for explaining the validate method, I have some trouble with it but I’m starting to understand it better now…
Tue Nov 29 17:52:46 -0800 2011
I really like using Rail because its such an awesome and versatile coding language.
Thu Oct 20 14:23:26 -0700 2011
I can definitely confirm this…
Fri Oct 21 00:11:38 -0700 2011
This was a fantastic post. Really loved reading your weblog post. The information was very informative and helpful.
Tue Nov 01 03:53:28 -0700 2011
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.
Wed Nov 02 02:51:34 -0700 2011
which also accepts an regular expression to match if i want to check the format of another field ‘phone’
Wed Nov 02 06:20:01 -0700 2011
Fantastic information, this great post – thanks so much
Wed Nov 02 12:10:28 -0700 2011
thankful to you for providing us with this invaluable info. My spouse and I are truthfully grateful, precisely the computer data we needed…
Thu Nov 03 02:06:44 -0700 2011
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.
Thu Nov 03 08:48:12 -0700 2011
visitors and customers, all of which shared some common validations, but were different enough that you had to separate them out?
Thu Nov 03 08:57:45 -0700 2011
I are truthfully grateful, precisely the computer data we needed…
Fri Dec 16 00:46:40 -0800 2011
Well, validations can also except a custom validation.
Sat Dec 17 16:21:22 -0800 2011
thanks for explaining the validate method, I have some trouble with it but I’m starting to understand it better now…
Sat Dec 17 16:21:39 -0800 2011
thanks for explaining the validate method, I have some trouble with it but I’m starting to understand it better now…
Mon Dec 19 01:17:53 -0800 2011
This type of “archaeology of the future” enables service providers to make early qualitative judgments about the implications of a design.
Mon Dec 19 12:04:03 -0800 2011
I don`t get it: what is the true meaning of this website?
Mon Dec 19 12:04:48 -0800 2011
hell yes… I have reached the maximum post limit.
Wed Dec 21 02:50:58 -0800 2011
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
Wed Dec 21 21:52:42 -0800 2011
After reading, and benefited a lot
Wed Dec 21 21:52:27 -0800 2011
After reading, and benefited a lot
Sun Dec 25 01:02:20 -0800 2011
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.
Mon Dec 26 10:48:50 -0800 2011
Thanks for making such a killer blog. I arrive on here all the time and am floored with the fresh information here!
Thu Dec 29 00:41:59 -0800 2011
Nice review of the topic , I was looking to understand this matter further and found this information to be informative.
Thu Dec 29 06:57:35 -0800 2011
I am still using the old code, I wanna try this but I am not sure if I can revert it back.
Thu Dec 29 06:57:45 -0800 2011
I am still using the old code, I wanna try this but I am not sure if I can revert it back.
Thu Dec 29 07:37:18 -0800 2011
I Think this Code in use Setting up Mobile Phone Apps this is why you blog is so valued
Sun Jan 01 23:51:13 -0800 2012
This new method is really good. Thanks
Sun Jan 01 23:52:26 -0800 2012
This method is really good. I have been using it too
Mon Jan 02 00:57:16 -0800 2012
I did not get any errors except email validation. But I can fix just need some time to get to know it.
Tue Jan 03 08:49:36 -0800 2012
I will try to use your tips on my future projects. I am sure that I will have excellent results.
Thu Jan 05 23:22:24 -0800 2012
Your article is very good, I like it very much.
Mon Jan 09 17:28:48 -0800 2012
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
Tue Jan 10 04:06:20 -0800 2012
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!
Tue Jan 10 04:09:04 -0800 2012
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!
Tue Jan 10 20:36:37 -0800 2012
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!
Thu Jan 12 14:33:44 -0800 2012
continue the work
Fri Jan 13 04:55:01 -0800 2012
A perfect info source. Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic
Fri Jan 13 22:30:07 -0800 2012
Nice post,not like some boring once,i definitely loved every little bit of it! Thanks for posting.
Fri Jan 13 22:31:06 -0800 2012
Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.
Mon Jan 16 23:58:17 -0800 2012
Please add more good information that would help others in such good way.
Tue Jan 17 06:28:05 -0800 2012
I love Rails 3 and personally use it almost every day!
Tue Jan 17 23:22:54 -0800 2012
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..
Wed Jan 18 06:05:11 -0800 2012
Does rails 3.0 intergrate with any version of the software? It looks suberb!
Wed Jan 18 11:46:26 -0800 2012
I was looking to understand this matter further and found this information to be informative.
Thu Jan 19 12:01:55 -0800 2012
Great website, I love this article, it’s very well researched.
Fri Jan 20 23:30:09 -0800 2012
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.
Sat Jan 21 04:17:06 -0800 2012
Thank you for sharing to us. There are many people searching about that now they will find enough resources by your post.
Sat Jan 21 09:30:25 -0800 2012
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.
Sat Jan 21 22:39:02 -0800 2012
I find the information posted here is very useful. Thanks for sharing them.
Sun Jan 22 07:26:46 -0800 2012
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.
Mon Jan 23 05:26:07 -0800 2012
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.
Mon Jan 23 05:27:01 -0800 2012
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.
Wed Jan 25 02:47:02 -0800 2012 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,
Wed Jan 25 09:48:34 -0800 2012
There are many people searching about that now they will find enough resources by your post.
Wed Jan 25 20:09:12 -0800 2012
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,
Fri Jan 27 09:41:58 -0800 2012
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.
Fri Jan 27 00:10:29 -0800 2012
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…
Fri Jan 27 09:42:22 -0800 2012
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.
Sat Jan 28 07:29:15 -0800 2012
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.
Sun Jan 29 12:44:21 -0800 2012
This facilitates the depletion of the remaining moisture in your home or wet areas due to water leakage.
Mon Jan 30 23:34:21 -0800 2012
That is a good idea to know the solution for this different ideas. Thanks.
Mon Jan 30 23:38:29 -0800 2012
it seems to be new to me when mentioning about those different views.
Tue Jan 31 00:32:51 -0800 2012
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.
Mon Jan 30 23:33:26 -0800 2012
That is a good view for different ideas. I will keep this for new update about the validate rail.
Tue Jan 31 20:18:37 -0800 2012
This is a great method to heal some bad diseases. Nice treatment.
Tue Jan 31 20:18:47 -0800 2012
This is a great method to heal some bad diseases. Nice treatment.
Wed Feb 01 11:42:36 -0800 2012
The evaluation of this data has proven very handy in identifying certain problems. Thanks for the help.
Wed Feb 01 14:13:11 -0800 2012
There are many people searching about that now they will find enough resources by your post.
Wed Feb 01 11:11:51 -0800 2012
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…
Fri Feb 03 07:51:16 -0800 2012
This was a fantastic post. Really loved reading your weblog post. The information was very informative and helpful.
Fri Feb 03 07:52:09 -0800 2012
This was a fantastic post. Really loved reading your weblog post. The information was very informative and helpful.