`
fireflyman
  • 浏览: 118282 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

在acts_as_authenticated里使用密码找回功能

阅读更多
虽然不喜欢这个插件,理由嘛,太老了...但还是要用,过段时间有机会再改吧

具体配置什么之类的,参考前一篇:
用rails实现简单邮件发送测试
http://fireflyman.iteye.com/blog/800955

(1)
ruby script/generate authenticated_mailer user


(2)删除models/user_notifier 里的两个方法:UserNotifier和activation
然后折腾后的代码是这样的--<

class UserNotifier < ActionMailer::Base
	@@session = ActionController::Integration::Session.new
#因为url_for是ActionController类控制器的实例方法,所以不能在邮件发送器中直接调用.
#因此我们创建了一个可以调用url_for的ActionController::Integration::Session对象,  #并赋值给一个类变量,这样就可以在邮件发送器中任意使用url_for 了
	def forgot_password(user)
	  setup_email(user)
	  @subject += "Password reset"
	  @body[:url] = @@session.url_for(:controller => "account",
												 :action => "reset_password",
												 :id => user.pw_reset_code,
												 :only_path => false )
	 end
											 
  protected
  def setup_email(user)
  	@subject = "hello World"
	@sent_on = Time.now
        @body[:user] = user
	@recipients = "#{user.email}"
	@from = 'xxx@163.com'
	@headers = {}
  end
end


(3)在views/user_notifier里创建对应的邮件模板,我的如下==>
Dear:<%= @user.login %>

请点击下面链接地址,以便重设密码:
<%= @url %>


(4)为users表增加pw_reset_code字段,目的是存放一个随机生成的记号,需要把这个记号发给用户.
ruby script/generate migration add_pw_reset_code_to_user


class AddPwResetCodeToUsers < ActiveRecord::Migration
  def self.up
	  add_column :users, :pw_reset_code, :string, :limit => 40
  end

  def self.down
	  remove_column :users, :pw_reset_code
  end
end


(5) 打开你的user.rb,增加下面两个类方法
 def forgot_password
    self.password_forgotten = true
	create_pw_reset_code
  end
  
  def reset_password
    update_attributes(:pw_reset_code => nil )
  end
  
  protected
   
    def create_pw_reset_code
	  self.pw_reset_code = Digest::SHA1.hexdigest("secret-#{Time.now}")
    end


(6)打开models/user_observer
class UserObserver < ActiveRecord::Observer

  def after_save(user)
	    UserNotifier.deliver_forgot_password(user) if user.password_forgotten
  end
  
end


(7)在environment.rb里加入这句==?
config.active_record.observers = [:user_observer]


(8)在account_controller里加入下面两个方法:
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


(9)到这一步已经没啥好做了,无非就设计两个页面-->自己慢慢改...
forgot_password.rhtml和reset_password.rhtml

<p>Give you email address and we'll send your instructions on how tou create a new one.</p>

<% form_for :user  do |f| %>
<p><label for="email">Email:</label><br/>
<%= text_field_tag :email %><br />
<%= submit_tag "Submit" %>
<% end %>



<%= error_messages_for :user %>
<% form_for :user do |f|%>
  <p>Password:<br/>
  <%= password_field :user,:password %></p>
  <p>Confirm password:<br/>
  <%= password_field :user,:password_confirmation %></p>
  <p><%= submit_tag "Submit"%></p>
<% end %>


好了,经测试,是可以的..这只是一个笔记记录,用上就用,用不上别骂..
分享到:
评论
1 楼 fireflyman 2011-01-05  
users_controller.rb:要改为-->
def forgot_password
  return unless request.post?
  if @user = User.find_by_email(params[:user][:email])
    @user.forgot_password
    @user.save
    flash[:notice] = "A password reset link has been sent to your email address"
    redirect_back_or_default('/')
  else
    flash[:alert] = "Could not find a user with that email address"
  end
end

def reset_password
  @user = User.find_by_password_reset_code(params[:id])
  return if @user unless params[:user]

  if ((params[:user][:password] && params[:user][:password_confirmation]) &&
      !params[:user][:password_confirmation].blank?)
    @user.reset_password
    @user.save
    flash[:notice] = @user.save ? "Password reset success." : "Password reset failed."
    redirect_back_or_default('/')
  else
    flash[:alert] = "Password mismatch"
  end
end


user.rb:

#重置密码
  def forgot_password
    @forgotten_password = true
    self.make_password_reset_code
  end

  def reset_password
    # First update the password_reset_code before setting the
    # reset_password flag to avoid duplicate email notifications.
    update_attributes(:password_reset_code => nil)
    @reset_password = true
  end

  def recently_forgot_password?
    @forgotten_password
  end

  def recently_reset_password?
    @reset_password
  end

protected
#重置码
  def make_password_reset_code
    self.password_reset_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
  end

相关推荐

    acts_as_authenticated

    2. **配置**:在`config/initializers/acts_as_authenticated.rb`中,你可以设置一些选项,如密码最小长度、哈希算法等。 3. **迁移**:acts_as_authenticated可能需要创建或修改数据库表,你需要运行相应的数据库...

    acts_as_list.rar

    acts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_...

    acts_as_list, 用于管理列表的ActiveRecord插件.zip

    acts_as_list, 用于管理列表的ActiveRecord插件 ActsAsList描述这个 acts_as 扩展提供了对列表中的多个对象进行排序和重新排序的功能。 具有指定的类的类需要在映射的数据库表上定义为整数的position 列。 0.8.0升级...

    acts_as_paranoid

    "acts_as_paranoid" 是一个在Ruby on Rails框架中常用的gem,用于处理数据库记录的软删除(soft delete)。在数据库操作中,通常我们会遇到删除数据的需求,但直接删除可能会导致数据丢失,尤其是在生产环境中。...

    用acts_as_rateable实现简单的打分功能

    在Ruby on Rails框架中,`acts_as_rateable`是一个非常实用的插件,它允许用户对模型进行评分,从而实现简单的打分功能。这个插件是Rails社区中的一个开源项目,旨在简化应用中的评分系统集成。在本篇讨论中,我们将...

    acts_as_nested_set的增强版BetterNestedSet

    acts_as_nested_set是Rails社区中广泛使用的Nested Set库,而BetterNestedSet则是它的增强版,提供了更多功能和优化。本文将深入探讨BetterNestedSet的原理、用法以及相较于acts_as_nested_set的优势。 1. Nested ...

    acts_as_category:想想acts_as_tree +权限

    #ActsAsCategory acts_as_category (Version 2.0 beta)acts_as_category,是acts_as插件在acts_as_tree风格的Ruby on Rails的ActiveRecord的模式,但有一些额外的功能,以及多种便捷视图助手。例子(有关实例方法和...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    Api-acts_as_api.zip

    Api-acts_as_api.zip,使在rails中创建api响应变得简单和有趣,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程...

    acts_as_restful_list:就像acts_as_list一样,但很安静

    就像acts_as_list 一样,但不必使用非标准方法调用(如insert_at)来弄乱您的代码,acts_as_restful_list 使管理列表变得简单。 您可以像更新其他任何内容一样更新 position 属性,其余的都由您来处理。 特点 通过...

    acts_as_paranoid:ActiveRecord插件可让您隐藏和还原记录,而无需实际删除它们

    已知的问题在同一模型上使用acts_as_paranoid和ActiveStorage 。 您不能直接以已删除状态创建模型,也不能在删除后更新模型。用法安装gem: gem 'acts_as_paranoid' , '~&gt; 0.7.0' bundle install创建迁移bin/rails ...

    active_record-acts_as, 模拟activerecord模型的多表继承.zip

    active_record-acts_as, 模拟activerecord模型的多表继承 插件开发已经移动这个项目的积极发展已经转移到了的krautcomputing fork 。 请在那里报告问题并打开 PRs ! ActiveRecord::ActsAs这是对 acts_as_relation的...

    acts_as_liked:向任何 Active Record 模型添加类似功能

    gem 'acts_as_liked' 然后执行: $ bundle 运行生成器: $ rails generate acts_as_liked 并且不要忘记迁移您的数据库 $ rake db:migrate 用法 可爱的模特 将acts_as_likeable添加到任何模型,它的实例可以被...

    acts_as_commentable_with_threading:类似于acts_as_commentable; 然而,利用 awesome_nested_set 提供线程评论

    与acts_as_commentable 兼容(但需要更改数据库架构) 要求 此 gem 的 2.x 版本仅适用于 Rails 4 及更高版本。 对于此 gem 的 Rails 3.x 兼容版本,请使用版本 1.2.0。 这个宝石取决于 CollectiveIdea 的 Awesome ...

    acts_as_aliased:扩展 ActiveRecord

    使用acts_as_aliased在模型中启用别名: model Company &lt; ActiveRecord::Base acts_as_aliased end 这假设您的公司模型中有一个名为name的列。 您可以通过传递column参数来指定不同的column : model ...

    actions_as_commentable:ActiveRecord acts_as_commentable插件

    gem 'acts_as_commentable' Rails gem 'acts_as_commentable' , '3.0.1' Rails gem 'acts_as_commentable' , git: 'git@github.com:jackdempsey/acts_as_commentable.git' , branch: '2.x' 生成器 Rails 3+ ...

    acts_as_xapian:Xapian全文搜索插件,适用于Ruby on Rails

    acts_as_xapian将Xapian的强大功能与Rails的优雅集成,使得开发者能够在Rails应用中轻松实现全文搜索功能。 该插件的主要特性包括: 1. **无缝集成**:acts_as_xapian能够无缝地与Rails模型集成,只需在模型中添加...

    acts_as_shopping_cart:简单的购物车实施

    acts_as_shopping_cart 一个简单的购物车实现。 您可以找到示例应用程序。 安装 滑轨3 从0.2.0版开始,不再支持Rails 3。 如果您仍需要在Rails 3应用程序中实现此gem,请使用0-1-x分支 将其包含在您的Gemfile中 ...

    acts_as_reference_data

    ActiveRecord::Base acts_as_reference_dataend假设已创建迁移以使用各种类型填充此表,例如SMS或EMAIL 。 这允许我们使用来自代码库的一致指针来引用这些数据库对象: if criteria_type == :mobile_number send_...

    acts_as_realtime:Gem 以简单的方式为您的索引添加实时功能

    这个gem的使用很简单,你只需要在我们想要的带有实时索引的模型中执行acts_as_realtime方法,该方法可以携带一系列参数来稍微修改行为和其他强制性参数,但这些将是后面解释了,另外一步就是在视图中插入必要的代码...

Global site tag (gtag.js) - Google Analytics