- 浏览: 332579 次
- 来自: 西安
文章分类
- 全部博客 (106)
- ruby 插件 (3)
- ruby on rails (33)
- google adsense (0)
- RedCloth (1)
- 情感 (5)
- 编程语言 (1)
- 新闻 (1)
- rails 环境 (1)
- ruby 编辑器 (1)
- python (1)
- linux (20)
- linux,gvim (2)
- mysql (4)
- oracle (4)
- ruby gem (2)
- Windows (2)
- http web 服务器 (1)
- c# (4)
- script (1)
- Microsoft (5)
- domain (1)
- php (4)
- 软件开发方法 (2)
- 设计模式 (0)
- powershell (4)
- android (2)
- Hyper-v (1)
- web (1)
- winserver 2012 R2 (1)
- delphi (1)
- sqlite (0)
- Git (1)
- redis (1)
- vpn (0)
最新评论
-
di1984HIT:
学习了~~
ROR rails正常启动,但是http://127.0.0.1:3000不能访问的解决办法 -
0372:
应该有吧!我自己认为!
ITeye还有人维护吗? -
shuaigelingfei:
cywhoyi 写道应该是放弃了吧记得2、3年前,weibo上 ...
ITeye还有人维护吗? -
cywhoyi:
应该是放弃了吧记得2、3年前,weibo上私信问过Robin, ...
ITeye还有人维护吗? -
catroll:
现在可以使用:service php7.0-fpm start ...
php使用php-fpm重启、停止操作命令
rails ruby ruby on rails敏捷开发最佳实践 李刚 rails的邮件抽象层 注册激活系统
现在好像Ruby on Rails越来越流行了,我也开始研究一下这门新兴的热门技术。今天刚看到网上推荐了一本新书《Ruby on Rails敏捷开发最佳实践》,第一作者就是颇受好评的《struts2权威指南》的作者李刚,而第二作者据说是位在外企工作很有ror经验的人士。我读了一下试读部分,果然清晰易懂,又讲解得十分透彻,而所举的例子也非常实用。
下面,我摘录了书中关于“注册激活系统”的部分,是Rails的邮件抽象层中的内容。这个例子对于以后做通过邮件来激活注册这样的项目时,就能派上用场了。
(1) 基本注册功能
当用户注册一个账户时,实际上就等同于向底层数据表增加一条记录,因此本应用必须有持久层支持。本示例应用的注册功能需要一个数据表支持,该数据表用于保存系统的所有注册账户。下面是本应用的数据库脚本:
1 drop database if exists regist_development;
2
3 create database regist_development;
4
5 use regist_development;
6
7 --创建用户表
8
9 create table users (
10
11 id int not null auto_increment,
12
13 name varchar(100) not null unique,
14
15 pass varchar(100) not null,
16
17 email varchar(150) not null,
18
19 active_code varchar(255),
20
21 is_activated boolean,
22
23 primary key (id)
24
25 );
上面创建了一个users数据表,该数据表里保存了用户名、密码、E-mail、激活码和是否激活等5个数据列。前三个数据列的作用非常清晰,此处不再赘述。激活码列用于保存用户刚刚注册时系统生成的注册码,这个注册码将通过邮件发送给用户,系统正是通过比较用户输入的注册码和这个注册码是否相等,从而决定是否可以激活用户。
上面的users数据表对应的持久化类是User,这个持久化类的代码非常简单,只是增加了一些Model校验功能。下面是User类的代码:
26 class User < ActiveRecord::Base
27
28 def validate
29
30 #验证name不能为空
31
32 errors.add("", "用户名只能是字母、数字或下划线,且长度必须为4到20位")
33
34 unless name=~ /^\w{4,20}$/
35
36 #验证name不能是一个数据库中已经存在的名字
37
38 errors.add("", "用户名不能重复,您选择的用户名已经存在")
39
40 unless User.find_by_name(name).nil?
41
42 #验证password不能为空
43
44 errors.add("", "密码只能是字母或数字,且长度必须为4到20位")
45
46 unless pass =~ /^[a-zA-Z0-9]{4,20}$/
47
48 #验证e-mail规则
49
50 errors.add("", "电子邮件必须匹配电子邮件规则")
51
52 unless email =~ /^\w+@\w+.[a-zA-Z]{2,6}$/
53
54 end
55
56 end
提供了上面的User Model之后,处理用户注册就非常简单了,只需要提供一个注册表单,这个表单里包含用户注册的基本信息即可。下面是用户注册的表单页代码:
57 <b>请输入您的注册信息</b><br>
58
59 <b>注意:请务必输入有效的邮箱用于接收激活邮件</b><br>
60
61 <%= error_messages_for :user %>
62
63 <% form_for :user, @user, :url => { :action => "pro_regist" } do |f| %>
64
65 用户名:<%= f.text_field :name %><br/>
66
67 密 码:<%= f.password_field :pass %><br/>
68
69 Email:<%= f.text_field :email %><br/>
70
71 <%= submit_tag("注册")%>
72
73 <% end %>
当用户单击“注册”按钮时,将会把表单提交到pro_regist Action。这个Action也非常简单,它只需调用该User类的create方法向users数据表中增加一条记录即可。下面是处理用户注册的Action代码:
74 # 处理用户登录
75
76 def pro_regist
77
78 #创建一个新的user对象
79
80 @user = User.new(params[:user])
81
82 # 以当前时间来随机生成激活码
83
84 @user.active_code = rand(Time.now.to_i).to_s
85
86 # 设置用户开始处于未激活状态
87
88 @user.is_activated = false
89
90 #如果user对象能成功地保存进数据库
91
92 if @user.save then
93
94 flash[:notice] = '您已经注册成功'
95
96 flash[:name] = @user.name
97
98 # 发送邮件
99
100 ActivateMail.deliver_sent(@user)
101
102 redirect_to :action => 'success'
103
104 # 保存失败
105
106 else
107
108 render :action => 'index'
109
110 end
111
112 end
上面的Action方法的实现与普通注册Action代码大致相似,不同的是上面的Action代码需要调用ActivateMail.deliver_sent(@user)代码来发送邮件。这行代码调用ActivateMail Model里的sent方法来发送激活邮件,这也就是本应用实现用户激活的重点。
(2) 发送激活邮件
本应用需要向注册用户发送激活邮件,对于Rails应用而言,激活邮件也就是一封最普通的邮件,因此我们像开发普通邮件模块一样来实现发送激活邮件。同样,我们先使用Rails提供的邮件代码生成器来生成一个邮件模块。进入Rails应用的根路径下,输入如下命令:
# 生成ActivateMail邮件Model,并提供一个sent方法
ruby script/generate mail ActivateMail sent
上面的代码生成器命令会在app/models路径下生成一个activate_mail.rb文件,这个文件就是邮件发送Model,该Model里定义了一个sent方法,该方法就是发送邮件的业务逻辑方法。修改上面的sent方法,让该sent方法实现发送激活邮件的功能。修改后的sent方法代码如下:
113 # 定义发送邮件的业务方法
114
115 def sent(user)
116
117 # 指定邮件标题
118
119 @subject = '激活邮件'
120
121 # 将新注册的User实例传给邮件内容模板
122
123 @body = {'user'=>user}
124
125 # 使用用户的注册邮件作为收件人地址
126
127 @recipients = user.email
128
129 # 使用spring_test@sina.com作为发件人地址
130
131 @from = 'spring_test@sina.com'
132
133 @sent_on = Time.now
134
135 @headers = {}
136
137 # 指定使用HTML格式的邮件
138
139 @content_type = 'text/html'
140
141 end
与前面完全类似的是,我们一样采用spring_test@sina.com作为发件人地址,这就要求我们必须在config路径下的environment.rb文件中配置sina的邮件服务器。在environment.rb文件中增加如下代码:
142 ActionMailer::Base.delivery_method = :smtp
143
144 ActionMailer::Base.server_settings = {
145
146 :address => 'smtp.sina.com',
147
148 :port => 25,
149
150 :domain => 'sina.com',
151
152 :user_name => 'spring_test@sina.com',
153
154 :password => '123456',
155
156 :authentication => :login }
157
158 ActionMailer::Base.default_charset = 'GBK'
经过上面步骤,我们已经实现了发送激活邮件的大部分功能。还有一个必须完成的地方:我们定义sent(user)方法时,该方法为@body赋值的是一个Hash对象,这意味着我们还需要为该方法指定一个邮件模板。
当我们执行ruby script/generate mail ActivateMail sent命令时,该命令还在app\views\activate_mail路径下生成了一个sent.rhtml文件,这个模板文件的响应将作为ActivateMail.sent(user)方法发送的邮件内容。sent.rhtml模板文件的代码如下:
159 <h4><%= @user.name%>,您好!</h4>
160
161 请在浏览器的地址栏中输入如下地址来激活您的账户:<br/>
162
163 <a href='http://localhost:3000/regist/pro_activate?name=<%= @user.name%>&active_code=
164
165 <%= @user.active_code%>'>
166
167 http://localhost:3000/regist/pro_activate?name=<%= @user.name%>&active_code=
168
169 <%= @user.active_code%>
170
171 </a>
上面的邮件模板是一个非常简单的页面,这个页面包含了一个简单的超级链接,这个超级链接将向服务器发送两个请求参数:用户名和验证码。
用户只要单击账户激活链接,就可以激活刚刚注册的账户。在还未激活用户账户之前,我们打开users数据表,看到用户刚刚注册的账户信息处于未激活状态。
当用户账户被激活后,is_activated列的值将变成1,这表明用户账户已被激活。
(3) 处理激活
用户单击激活邮件中的链接,相当于向系统的regist控制器的pro_activate Action发送一个请求,并将用户名和激活码作为请求参数,Rails应用将根据这两个请求参数来决定是否激活用户账户。下面是pro_activate Action的代码:
172 # 处理用户激活
173
174 def pro_activate
175
176 user = User.find_by_name(params[:name])
177
178 # 如果用户不为空,且用户处于未激活状态,且用户输入的激活码正确
179
180 if user != nil && user.is_activated == false && user.active_code == params[:active_code] then
181
182 # 修改激活状态
183
184 user.update_attribute(:is_activated , true)
185
186 flash[:notice] = "恭喜您,您已经成功激活了您的账户!"
187
188 # 如果用户已经处于激活状态
189
190 elsif user != nil && user.is_activated == true then
191
192 flash[:notice] = "您的账户已经处于激活状态,请勿重复激活!"
193
194 else
195
196 flash[:notice] = "激活失败!"
197
198 end
199
200 redirect_to :action=>'activate_result'
201
202 end
上面Action先根据发送的name请求参数取出users表中对应的用户账户,然后判断取出的账户里包含的激活码与用户请求中包含的激活码请求参数是否相同。如果两个激活码相同,而且用户还未激活,系统将把用户账户的is_activated属性修改为true,即完成用户激活。如果用户的is_activated状态已经是true,则提醒用户不用重复激活账户。
当用户注册成功,并且通过激活链接来激活账户后,也就是将users数据表中对应记录行的is_activated数据列的值修改为1。
发表评论
-
ROR windows 开发环境配置
2017-02-17 20:06 0今天来了兴致想弄下ROR了,本人用的windows8.1 ... -
ROR rails正常启动,但是http://127.0.0.1:3000不能访问的解决办法
2014-10-14 16:25 5441D:\aaa>rails s => Booti ... -
Problem installing RMagick rubygem on Centos 6.3
2014-04-18 23:20 2532gem install rmagick出现错误: Bu ... -
centos yum install nokogiri 1.5.8 不成功的解决方案
2014-04-18 23:03 4297centos下安装nokogiri不成功,提示如下: ge ... -
Scope- ruby中变量的作用范围
2013-06-01 22:54 2389ruby中变量的作用范围有3种 1. Class d ... -
ruby-1.8.7中truncate方法重写
2013-04-29 23:49 1393在ruby-1.8.7中的运用方法truncate会存在问题 ... -
Linux 环境passenger多ruby版本共存部署
2013-04-25 21:53 36481.安装rvm Ruby代码 mk ... -
快速正确的安装 Ruby, Rails 运行环境
2013-04-22 10:50 1248系统需求 首先确定操作系统环境,不建议在 Windows ... -
Nginx+mongrel部署Rails应用
2013-04-21 22:12 1335安装nginx 下载地址 http://nginx.o ... -
从Rails2到Rails3
2013-04-19 15:25 1296我们来看下rails3相比rails2, 进步在哪里, 优势 ... -
用 Ruby scrAPI 做数据采集
2013-02-28 21:59 1469前天在 Railscasts 上 ... -
Ruby 在 Windows 下播放声音
2013-02-07 00:12 1337[代码] ruby代码 -
Ruby读取键盘输入 windows
2013-02-07 00:11 1696[代码] ruby代码 -
rails查看工程的版本兼容问题
2013-02-03 22:37 2126很初学Rails不久,感到Rails的版本不兼容是一个让人 ... -
Ruby 构建支持多线程的 Web 服务器
2013-02-01 22:59 1457[代码] ruby代码 -
Ruby on Rails 使用 Cookie 的方法
2013-02-01 22:55 1305代码] oschina_hello.rb -
蒙娜丽莎的微笑 Ruby实现
2013-01-31 22:27 7278这个挺有意思:Ruby 的 UI 库向来不怎么样,所以这 ... -
Ruby多进程并行抓取网页
2013-01-30 21:42 2031想研究一下各大网站首页有多少个链接,于是用Ruby写 ... -
ruby 163 发送 邮件
2013-01-30 21:01 1542最近学习ruby 写了个 mail 发送 邮件 16 ... -
sitemap_generator 生成 Sitemap
2013-01-27 21:00 1721安装 编辑Gemfile 1 ...
相关推荐
在Ubuntu上配置Ruby on Rails框架和RubyMine IDE开发环境是一个重要的步骤,对于想要在Linux环境下进行Web开发的程序员来说,这是必备的知识。Ruby on Rails是一个强大的全栈Web框架,它基于Ruby语言,大大简化了Web...
在Ruby on Rails开发中,有时我们希望使用UUID(Universally Unique Identifier)而非传统的自增整数ID作为模型的主键。UUID是一种确保每个生成的ID在全球范围内都是唯一的标准方法。在与PostgreSQL数据库配合时,...
通过构建一个真实的社交网络网站——RailsSpace,本书系统地介绍了Ruby on Rails框架的核心技术和最佳实践。从基础知识到高级特性,从理论到实践,本书旨在帮助读者全面掌握Ruby on Rails的开发技巧。无论是新手还是...
MailyHerald是Ruby on Rails的瑰宝,可帮助您发送和管理应用程序邮件。 将Maily视为自托管的Mailchimp替代方案,您可以轻松地将其集成到您的站点中。 MailyHerald既适用于电子邮件营销,也可以处理您发送给用户的...
- 注册激活RubyMine。 ##### 2. 修改GemFile 在RubyMine中创建新项目时,通常会自动生成一个`Gemfile`文件。为了确保项目能够正确使用MySQL数据库驱动,我们需要在`Gemfile`中指定MySQL2 gem版本。 ```ruby ...
这个插件的目的是让你在编写Ruby on Rails应用时能够快速输入常见的代码结构,减少重复劳动,提升开发速度。 Ruby是一种面向对象的、动态类型的编程语言,以其简洁和强大的语法闻名。Rails是基于Ruby的Web开发框架...
在探索如何将Adobe Flex3与Ruby on Rails(简称Rails)结合,创建动态Web应用的过程中,一个常见的入门案例便是“HelloWorld”。此案例不仅展示了这两种技术如何协同工作,还揭示了它们在构建交互式用户界面方面的...
在Ruby on Rails开发中,枚举(Enums)是一种常见的数据类型,用于定义有限的、命名的整数集合。这些枚举常用于模型属性,提供更易读、更强大的代码。"Ruby-TranslateEnum"是一个针对Rails应用的开源gem,旨在为...
在Ruby on Rails框架中,ActiveRecord是用于数据库交互的核心组件,它允许开发者使用简洁的语法进行数据查询和操作。在数据库记录中,有时我们需要找出某条记录的前一条或后一条记录,例如在实现分页功能或者上下文...
**Rails 3 in Action** 这本书介绍了 **Ruby on Rails**(简称 Rails)这一 Web 开发框架的核心概念和技术细节。Rails 自发布以来便以其优雅、高效、易于使用的特性而闻名,它极大地简化了 Web 应用程序的开发过程。...
Ruby-Authlogic 是一款强大的身份验证库,专为 Ruby on Rails 应用程序设计。它提供了一种优雅、模块化的方式来处理用户登录、会话管理以及密码安全等核心身份验证功能。这个库的主旨是保持代码简洁,易于理解和维护...
- **特点**:除了基本的代码编辑和调试功能外,还提供了Ruby on Rails框架的支持,如模型生成、数据库迁移管理等。 #### 3. PhpStorm - **用途**:适用于PHP开发者的一款IDE。 - **特点**:支持PHP、HTML和...
在Ruby on Rails开发中,Devise Invitable是一个非常流行的用户邀请系统,它扩展了Devise gem的功能,允许用户向其他人发送邀请。Rails Admin则是一个强大的后台管理界面生成工具,可以帮助开发者快速创建管理面板。...
描述中提到的“动态滚屏查看rails程序的信息”,暗示了这个工具可能特别适用于Ruby on Rails开发者。Rails是基于Ruby语言的Web应用框架,其运行会产生大量的日志信息,包括HTTP请求、数据库交互、错误报告等。...
在Ruby on Rails框架中,页面中的常用函数是构建动态网页的关键元素。`list.rhtml`是一个典型的Rails视图模板文件,用于渲染HTML并结合服务器端的逻辑。在本例中,我们将深入探讨`list.rhtml`文件可能包含的Rails...