读书人

在acts_as_authenticated里兑现账号激

发布时间: 2012-12-24 10:43:14 作者: rapoo

在acts_as_authenticated里实现账号激活
之前写过密码找回的,账号激活的也一起写吧...下面的代码是在之前那个的基础上改的...
在acts_as_authenticated里使用密码找回功能
http://fireflyman.iteye.com/blog/801953

首先,请不要再问我为什么不使用
restful_authentication这个插件,一句命令就解决了...

ruby script/generate authenticated user sessions --include-activation

而且有现成的例子...
用Rails 2.3打造简单记账软件(3)
http://dohkoos.name/use-rails-23-to-create-a-simple-accounting-app-3.html

反正就一言难尽..非要说一句的话,我只能说:火星文,你妹啊...

废话就不说了,开始吧:
1.为Users表增加两个字段activation_code和activated_at
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


2.account_controller改成下面这样-->
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


3.user.rb里也要作相关修改-->
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    #邮箱激活==========================================================


4.这时候你的user_notifier.rb应该是这样的
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


5.user_observer.rb里变成这样了
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


6.在route.rb里加一句
map.activate '/activate/:activation_code', :controller => 'account', :action => 'activate', :activation_code => nil


7.打开enviroment.rb
SITE_URL = "localhost:3000"ADMINEMAIL = "XXX@163.com"


8.在views/user_notifier增加两个文件,分别为signup_notification.html.erb和activation.html.erb

(1)signup_notification.html.erb
Your account has been created.  Username: <%= @user.login %>  Password: <%= @user.password %>Visit this url to activate your account:  <%= @url %>


(2)activation.html.erb
<%= @user.login %>, your account has been activated.  You may now start adding your plugins:<%= @url %>


反正暂时是成功的....ruby script/generate authenticated user sessions --include-activation
后,会存在一个小bug,即新用户注册后不激活就登录了系统。

通过注释掉app/controllers/users_controller.rb中create下的
self.current_user = @user


可修复问题.

读书人网 >编程

热点推荐