在acts_as_authenticated里实现账号激活

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

首先,请不要再问我为什么不使用
restful_authentication这个插件,一句命令就解决了...
ruby script/generate authenticated user sessions --include-activation

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

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

废话就不说了,开始吧:
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
end
end


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('/')
end
end
#=========================================================================
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.new

def 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 = {}
end
end


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 %>


反正暂时是成功的....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值