在acts_as_authenticated里实现账号激活
之前写过密码找回的,账号激活的也一起写吧...下面的代码是在之前那个的基础上改的...
在acts_as_authenticated里使用密码找回功能
http://fireflyman.iteye.com/blog/801953
首先,请不要再问我为什么不使用
restful_authentication这个插件,一句命令就解决了...
ruby script/generate authenticated user sessions --include-activation
ruby script/generate migration AddActivationCodeToUser activation_code:string activated_at:datetime
class AddActivationCodeToUser < ActiveRecord::Migration def self.up add_column :users, :activation_code, :string,:limit => 40 add_column :users, :activated_at, :datetime end def self.down remove_column :users, :activated_at remove_column :users, :activation_code endend
rake db:migrate
class AccountController < ApplicationController # Be sure to include AuthenticationSystem in Application Controller instead #include AuthenticatedSystem # If you want "remember me" functionality, add this before_filter to Application Controller before_filter :login_from_cookie # say something nice, you goof! something sweet. def index redirect_to(:action => 'signup') unless logged_in? || User.count > 0 end def login return unless request.post? self.current_user = User.authenticate(params[:login], params[:password]) if logged_in? if params[:remember_me] == "1" self.current_user.remember_me cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at } end redirect_back_or_default(:controller => '/account', :action => 'index') flash[:notice] = "Logged in successfully" else flash[:notice] = "该账号尚未激活" note_failed_signin @login = params[:login] @remember_me = params[:remember_me] render :action => 'login' end # end def signup @user = User.new(params[:user]) return unless request.post?success = @user && @user.save if success && @user.errors.empty? redirect_back_or_default('/') flash[:notice] = "很感谢你注册!我们已经发了一封激活邮件到你的注册邮箱里,请注意查收." else flash[:error] = "We couldn't set up that account, sorry. Please try again, or contact an admin (link is above)." render :action => 'signup' end #================ #@user.save! #self.current_user = @user #redirect_back_or_default(:controller => '/account', :action => 'index') # flash[:notice] = "Thanks for signing up!" #rescue ActiveRecord::RecordInvalid #render :action => 'signup' end #邮箱激活================================================================ def activate # logout_keeping_session! user = User.find_by_activation_code(params[:activation_code]) unless params[:activation_code].blank? case when (!params[:activation_code].blank?) && user && !user.active? user.activate! flash[:notice] = "账号已激活! 请登录你的系统." redirect_to '/account/login' when params[:activation_code].blank? flash[:error] = "The activation code was missing. Please follow the URL from your email." redirect_back_or_default('/') else flash[:error] = "We couldn't find a user with that activation code -- check your email? Or maybe you've already activated -- try signing in." redirect_back_or_default('/') endend#========================================================================= def logout self.current_user.forget_me if logged_in? cookies.delete :auth_token reset_session flash[:notice] = "You have been logged out." redirect_back_or_default(:controller => '/account', :action => 'index') end def forgot_password return unless request.post? if @user = User.find_by_email(params[:email]) @user.forgot_password @user.save flash[:notice] = "An email with instructions for resetting your password has been sent to your email address." redirect_back_or_default(:controller => "/account") else flash.now[:notice] = "Could not find a user with the given email address."#render :forgot_password end end def reset_password @page_title = "Reset Password" @user = User.find_by_pw_reset_code(params[:id]) rescue nil unless @user render(:text => "Not found",:status => 404) return end return unless request.post? if @user.update_attributes(params[:user]) @user.reset_password flash[:notice] = "Password successfully reset." redirect_back_or_default(:controller => "/account") end end protected # Track failed login attempts def note_failed_signin flash[:error] = "Couldn't log you in as '#{params[:login]}'" logger.warn "Failed login for '#{params[:login]}' from #{request.remote_ip} at #{Time.now.utc}" end end
before_create :make_activation_code #邮箱激活========================================================== # Activates the user in the database. def activate! @activated = true self.activated_at = Time.now.utc self.activation_code = nil save(false) end # Returns true if the user has just been activated. def recently_activated? @activated end def active? # the existence of an activation code means they have not activated yet activation_code.nil? end #邮箱激活========================================================== #邮箱激活===================================================== def make_activation_code self.activation_code = self.class.encrypt(Time.now, 10.times.map { rand.to_s }) end #邮箱激活==========================================================
class UserNotifier < ActionMailer::Base@@session = ActionController::Integration::Session.newdef forgot_password(user) setup_email(user) @subject += "密码重置" @body[:url] = @@session.url_for(:controller => "account", :action => "reset_password", :id => user.pw_reset_code, :only_path => false )end #邮箱激活============================================================== def signup_notification(user) setup_email(user) @subject += '亲爱的用户,请去邮箱激活你的用户吧.谢谢!' @body[:url] = "http://#{SITE_URL}/activate/#{user.activation_code}" end def activation(user) setup_email(user) @subject += 'Your account has been activated!' @body[:url] = "http://#{SITE_URL}/" end#邮箱激活============================================================== protected def setup_email(user)@recipients = "#{user.email}"@from = "#{ADMINEMAIL}" @subject = "[#{SITE_URL}] "@sent_on = Time.now @body[:user] = user@headers = {} endend
class UserObserver < ActiveRecord::Observer def after_create(user) UserNotifier.deliver_signup_notification(user) end def after_save(user) UserNotifier.deliver_activation(user) if user.recently_activated? UserNotifier.deliver_forgot_password(user) if user.password_forgotten end end
map.activate '/activate/:activation_code', :controller => 'account', :action => 'activate', :activation_code => nil
SITE_URL = "localhost:3000"ADMINEMAIL = "XXX@163.com"
Your account has been created. Username: <%= @user.login %> Password: <%= @user.password %>Visit this url to activate your account: <%= @url %>
<%= @user.login %>, your account has been activated. You may now start adding your plugins:<%= @url %>
self.current_user = @user