<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9166357975681434144</id><updated>2011-10-08T02:56:30.182-07:00</updated><title type='text'>validates_confirmation_of :email</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://validatesconfirmationof.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9166357975681434144/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://validatesconfirmationof.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>philrosenstein</name><uri>http://www.blogger.com/profile/08854010533937593604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9166357975681434144.post-7504524947587800752</id><published>2010-08-18T12:52:00.000-07:00</published><updated>2010-08-18T13:15:51.470-07:00</updated><title type='text'>devise gem provides powerful rails authentication out of the box</title><content type='html'>I decided that it was time to switch over to authlogic now that I'm a bit more comfortable with ruby and rails, but I couldn't get past an annoying bug where my User.password virtual attribute couldn't be found, despite ensuring that I had the spelling correct for the authlogic "magic" column names, and confirming over and over that I defined attr_accessible :password&lt;br /&gt;&lt;br /&gt;Then I stumbled upon a relatively new gem called &lt;a href="http://github.com/plataformatec/devise"&gt;devise&lt;/a&gt;, which comes with modules to satisfy all common project requirements such as automatic account locking, session timeouts, forgotten passwords and more.&lt;br /&gt;&lt;br /&gt;After struggling with authlogic for an entire day, it was nice to have devise up and running in a matter of minutes, and see all the aforementioned functionality working out of the box.&lt;br /&gt;&lt;br /&gt;One thing that I haven't been able to find online is a convenient reference of the attributes and methods that devise adds to your user model, so I compiled a crude one.  It is not categorized by module, but it should be pretty evident by the names:&lt;br /&gt;&lt;br /&gt;devise attributes:&lt;br /&gt;&lt;br /&gt;confirmation_sent_at&lt;br /&gt;confirmed_at &lt;br /&gt;current_sign_in_ip &lt;br /&gt;failed_attempts &lt;br /&gt;last_sign_in_at &lt;br /&gt;last_sign_in_ip &lt;br /&gt;locked_at &lt;br /&gt;locked_out_at &lt;br /&gt;sign_in_count &lt;br /&gt;unlock_token&lt;br /&gt;&lt;br /&gt;devise methods:&lt;br /&gt;&lt;br /&gt;access_locked? &lt;br /&gt;active? &lt;br /&gt;confirmation_required? &lt;br /&gt;confirmed? &lt;br /&gt;if_access_locked &lt;br /&gt;lock! &lt;br /&gt;lock_access! &lt;br /&gt;locking_enabled? &lt;br /&gt;lock_expired? &lt;br /&gt;resend_unlock_token &lt;br /&gt;reset_password! &lt;br /&gt;send_reset_password_instructions &lt;br /&gt;timedout? &lt;br /&gt;unless_confirmed &lt;br /&gt;unlock_access!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9166357975681434144-7504524947587800752?l=validatesconfirmationof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://validatesconfirmationof.blogspot.com/feeds/7504524947587800752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://validatesconfirmationof.blogspot.com/2010/08/device-gem-powerful-rails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9166357975681434144/posts/default/7504524947587800752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9166357975681434144/posts/default/7504524947587800752'/><link rel='alternate' type='text/html' href='http://validatesconfirmationof.blogspot.com/2010/08/device-gem-powerful-rails.html' title='devise gem provides powerful rails authentication out of the box'/><author><name>philrosenstein</name><uri>http://www.blogger.com/profile/08854010533937593604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9166357975681434144.post-7326232029225280310</id><published>2010-04-07T18:19:00.000-07:00</published><updated>2010-04-07T18:54:47.815-07:00</updated><title type='text'>github project howto: fork, clone, modify, request merge</title><content type='html'>I use the searchlogic gem by binarylogic for report search filters and it works great, but unfortunately it doesn't support the rails datetime_select helpers.  The issue has existed on github for many months, and one user even offered a nice gist to fix the problem.  Many months later and it still has not found its way into searchlogic master.  So I figured its time to give back to the open source community by making it as easy as possible for Ben to incorporate the fix.&lt;br /&gt;&lt;br /&gt;1. Fork the project on github http://help.github.com/forking/&lt;br /&gt;&lt;br /&gt;2. Clone your fork.  &lt;br /&gt;2.1 If you have never done this before, you'll have to upload a private ssh key to github first.  See http://help.github.com/mac-key-setup/&lt;br /&gt;2.2 Then you can clone your newly-forked version of the project:&lt;br /&gt;&lt;br /&gt;git clone git@github.com:philrosenstein/searchlogic.git&lt;br /&gt;&lt;br /&gt;3. Run the tests.  In my case I provided a relative path to spec in my rails project.&lt;br /&gt;&lt;br /&gt;../path/to/script/spec ./spec/search_spec.rb -c&lt;br /&gt;&lt;br /&gt;4. Make the changes locally.  Using your favorite editor of course.&lt;br /&gt;&lt;br /&gt;5. Run the tests again to make sure you haven't broken anything.  You should also add new test cases if you have added functionality.&lt;br /&gt;&lt;br /&gt;6. Commit the changes.&lt;br /&gt;&lt;br /&gt;7. Request a merge from the project owner.  If you are confident in your changes and they will make the project better for others, this is where you give back to the community that your projects have benefited so much from!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9166357975681434144-7326232029225280310?l=validatesconfirmationof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://validatesconfirmationof.blogspot.com/feeds/7326232029225280310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://validatesconfirmationof.blogspot.com/2010/04/github-project-howto-fork-clone-modify.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9166357975681434144/posts/default/7326232029225280310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9166357975681434144/posts/default/7326232029225280310'/><link rel='alternate' type='text/html' href='http://validatesconfirmationof.blogspot.com/2010/04/github-project-howto-fork-clone-modify.html' title='github project howto: fork, clone, modify, request merge'/><author><name>philrosenstein</name><uri>http://www.blogger.com/profile/08854010533937593604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9166357975681434144.post-3190289491910642599</id><published>2009-11-11T12:45:00.000-08:00</published><updated>2009-11-11T14:28:19.365-08:00</updated><title type='text'>Add a Lost Password feature to restful_authentication</title><content type='html'>This post describes how to add a lost password feature to restful_authentication.  It is based off the instructions found &lt;a href="http://railsforum.com/viewtopic.php?id=11962"&gt;here&lt;/a&gt;, adding some extra robustness and fixes for updates in the authentication plugin.&lt;br /&gt;&lt;br /&gt;app/controllers/users_controller.rb&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt;&lt;span class="text text_plain"&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;&lt;br /&gt;   before_filter :login_required, :except =&amp;gt; [:new, :create, :activate, :lost_password, :reset_password]&lt;br /&gt;   before_filter :get_partial_user_from_session, :only =&amp;gt; [:new, :lost_password]&lt;br /&gt;   after_filter :save_partial_user_in_session, :only =&amp;gt; [:new, :lost_password]&lt;br /&gt;   require_role "admin", :for_all_except =&amp;gt; [:new, :create, :activate, :edit, :update, :lost_password, :reset_password]&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;def lost_password&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;case request.method&lt;br /&gt;     when :post&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;@user.attributes = params['user']&lt;br /&gt;       if valid_for_attributes(@user, ["email","email_confirmation"])&lt;br /&gt;&lt;/span&gt;         &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;user = User.find_by_email(params[:user][:email])&lt;br /&gt;         user.create_password_reset_code if user&lt;br /&gt;         flash[:notice] = "Reset code sent to #{params[:user][:email]}"&lt;br /&gt;         redirect_back_or_default('/')&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;else&lt;br /&gt;&lt;/span&gt;         &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;flash[:error] = "Please enter a valid email address"&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;when :get&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;@user = User.new&lt;br /&gt;       @user.confirming_email = true&lt;br /&gt;       @user.updating_email = false&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;def reset_password&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;@user = User.find_by_password_reset_code(params[:reset_code]) unless params[:reset_code].nil?&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;if !@user&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;flash[:error] = "Reset password token invalid, please contact support."&lt;br /&gt;       redirect_to('/')&lt;br /&gt;       return&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;else&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;@user.crypted_password = nil&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;     if request.post?&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;if @user.update_attributes(:password =&amp;gt; params[:user][:password], :password_confirmation =&amp;gt; params[:user][:password_confirmation])&lt;br /&gt;&lt;/span&gt;         &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;#self.current_user = @user&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;@user.delete_password_reset_code&lt;br /&gt;&lt;/span&gt;         &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;flash[:notice] = "Password updated successfully for #{@user.email} - You may now log in using your new password."&lt;br /&gt;         redirect_back_or_default('/')&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;else&lt;br /&gt;&lt;/span&gt;         &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;render :action =&amp;gt; :reset_password&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;# Might be a good addition to AR::Base&lt;br /&gt;  def valid_for_attributes( model, attributes )&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;unless model.valid?&lt;br /&gt;&lt;/span&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;errors = model.errors&lt;br /&gt;      our_errors = Array.new&lt;br /&gt;      errors.each { |attr,error|&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;if attributes.include? attr&lt;br /&gt;&lt;/span&gt;          &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;our_errors &amp;lt;&amp;lt; [attr,error]&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;}&lt;br /&gt;      errors.clear&lt;br /&gt;      our_errors.each { |attr,error| errors.add(attr,error) }&lt;br /&gt;      return false unless errors.empty?&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;    return true&lt;br /&gt;&lt;/span&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;app/models/user.rb&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt; &lt;span class="text text_plain"&gt;&lt;br /&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;validates_uniqueness_of   :email,               :if =&amp;gt; :updating_email?&lt;br /&gt;&lt;/span&gt;    &lt;br /&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;validates_presence_of     :email_confirmation,  :if =&amp;gt; :confirming_email&lt;br /&gt;   validates_confirmation_of :email,               :if =&amp;gt; :confirming_email&lt;br /&gt;&lt;/span&gt;  &lt;br /&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;attr_accessible :login, :email, :email_confirmation&lt;br /&gt;&lt;/span&gt;  &lt;br /&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;attr_accessor :updating_email, :confirming_email  # allows us to control when email uniqueness and confirmation are validated (respectively)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;def create_password_reset_code&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;@password_reset = true&lt;br /&gt;     self.password_reset_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )&lt;br /&gt;     self.save(false)&lt;br /&gt;&lt;/span&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;   def password_recently_reset?&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;@password_reset&lt;br /&gt;&lt;/span&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end &lt;br /&gt;   def delete_password_reset_code&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;self.password_reset_code = nil&lt;br /&gt;     self.save(false)&lt;br /&gt;&lt;/span&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;protected&lt;br /&gt;&lt;/span&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;def updating_email?&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;# validate_uniqueness_of email unless specifically set to false&lt;br /&gt;     if updating_email == false&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;return false&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;else&lt;br /&gt;&lt;/span&gt;       &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;return true&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;app/models/user_mailer.rb&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt; &lt;span class="text text_plain"&gt;&lt;br /&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;def password_reset_notification(user)&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;setup_email(user)&lt;br /&gt;     @subject    = 'Link to reset your password'&lt;br /&gt;     @body[:url]  = "&lt;span class="markup markup_underline markup_underline_link markup_underline_link_text"&gt;http://www.yourapp.com/reset_password/#&lt;/span&gt;{user.password_reset_code}"&lt;br /&gt;&lt;/span&gt;   &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt;    &lt;br /&gt;&lt;/span&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;app/models/user_observer.rb&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt; &lt;span class="text text_plain"&gt;&lt;br /&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;def after_save(user)&lt;br /&gt;&lt;/span&gt;         &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;UserMailer.deliver_password_reset_notification(user) if user.password_recently_reset?&lt;br /&gt;&lt;/span&gt;     &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;end&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;app/views/sessions/new.html.haml&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt; &lt;span class="text text_plain"&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;= link_to " &amp;gt; Lost Password?", lost_password_path&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;config/routes.rb&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt; &lt;span class="text text_plain"&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;&lt;br /&gt;   map.lost_password '/lost_password', :controller =&amp;gt; 'users', :action =&amp;gt; 'lost_password'&lt;br /&gt;   map.reset_password 'reset_password/:reset_code', :controller =&amp;gt; 'users', :action =&amp;gt; 'reset_password'&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;users migration file:&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt; &lt;span class="text text_plain"&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;t.string    :password_reset_code,       :limit =&amp;gt; 40&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;app/views/user_mailer/password_reset_notification.erb&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt;&lt;span class="text text_plain"&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;Request to reset password received for &amp;lt;%= @user.login %&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;Visit this url to choose a new password:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;&amp;lt;%= @url %&amp;gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;(Your password will remain the same if no action is taken)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;app/views/users/lost_password.html.haml&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt;&lt;span class="text text_plain"&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%h2 Lost Password&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%p&lt;br /&gt;&lt;/span&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;Please enter the email address that you registered with. Once you click on the Send button we will send you an email that allows you to change your password.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;= error_messages_for :user, :header_message =&amp;gt; "Please review the following errors:", :message =&amp;gt; ""&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;- form_for :user do |f|&lt;br /&gt;&lt;/span&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%table&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%tr&lt;br /&gt;&lt;/span&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%td{:align =&amp;gt; "right"}&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;Email Address&lt;br /&gt;&lt;/span&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%td&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;= f.text_field :email&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%tr&lt;br /&gt;&lt;/span&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%td{:align =&amp;gt; "right"}&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;Retype Email Address&lt;br /&gt;&lt;/span&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%td&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;= f.text_field :email_confirmation&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%tr&lt;br /&gt;&lt;/span&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%td&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;&amp;amp;nbsp;&lt;br /&gt;&lt;/span&gt;      &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%td&lt;br /&gt;&lt;/span&gt;        &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;= submit_tag 'Submit'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;app/views/users/reset_password.html.haml&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source sunburst"&gt;&lt;span class="text text_plain"&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;= error_messages_for :user&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%h2 Choose a new password&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;- form_for :user do |f|&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%div&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;New Password:&lt;br /&gt;    = f.password_field :password&lt;br /&gt;&lt;/span&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%div&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;Confirm Password:&lt;br /&gt;    = f.password_field :password_confirmation&lt;br /&gt;&lt;/span&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;%div&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;= submit_tag 'Change Password'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9166357975681434144-3190289491910642599?l=validatesconfirmationof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://validatesconfirmationof.blogspot.com/feeds/3190289491910642599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://validatesconfirmationof.blogspot.com/2009/11/add-lost-password-feature-to.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9166357975681434144/posts/default/3190289491910642599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9166357975681434144/posts/default/3190289491910642599'/><link rel='alternate' type='text/html' href='http://validatesconfirmationof.blogspot.com/2009/11/add-lost-password-feature-to.html' title='Add a Lost Password feature to restful_authentication'/><author><name>philrosenstein</name><uri>http://www.blogger.com/profile/08854010533937593604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry></feed>
