Ruby on Rails实现最基本的用户注册和登录功能的教程
在Rails实现用户注册和登录功能是非常方便的,比如可以使用Devise这类实现了完整功能的gem扩展包。也可以使用Rails自带的has_secure_password来自已打造。下面就是尝试使用has_secure_password来实现用户注册和登录功能。
准备工作
创建项目:
railsnewuser_login
has_secure_password中加密的功能需要用到bcrypt,所以需要在项目中启用bcryptgem包。进入项目目录,修改Gemfile文件如下内容:
#UseActiveModelhas_secure_password gem'bcrypt','~>3.1.7'
保存后退出,执行bundleinstall命令安装新启用的gem包。
创建用户模块
操作和管理用户信息需要先创建保存用户的数据表和模型:
railsgmodelusername:stringpassword_digest:string
password_digest这个字段是用来保存加密混淆后的密码串的,必须提供并且不能更改成其它名称,否则无法正常使用has_secure_password提供的功能。
然后在用户模块中引入has_secure_password功能:
#app/models/user.rb classUser<ActiveRecord::Base has_secure_password end
创建用户数据表:
rakedb:migrate
实现注册功能
创建一个Applicant(申请者)控制器用来处理用户注册:
railsgcontrollerapplicantsnewcreate
applicants控制器提供了两个方法:
- new:用来处理注册界面
- create:用来保存注册信息
上面命令创建的控制器方法,默认使用的都是get请求。保存注册信息的create方法使用的是post请求。所以需要到config/routes.rb中修改如下内容:
post'applicants/create'
完成注册控制器功能:
#app/controllers/applicants_controller.rb classApplicantsController<ApplicationController defnew @user=User.new end defcreate @user=User.create(user_params) if@user.save redirect_to:sessions_new else render"new" end end private defuser_params params.require(:user).permit(:name,:password,:password_confirmation) end end
完成注册界面功能:
<!--app/views/applicants/new.html.erb--> <h1>注册</h1> <%if@user.errors.any?%> <ul> <%@user.errors.full_messages.eachdo|message|%> <li><%=message%></li> <%end%> </ul> <%end%> <%=form_for@user,url::applicants_createdo|f|%> <p> <%=f.label:name%> <%=f.text_field:name%> </p> <p> <%=f.label:password%> <%=f.password_field:password%> </p> <p> <%=f.label:password_confirmation%> <%=f.password_field:password_confirmation%> </p> <p><%=f.button"提交"%></p> <%end%>
这样就简单的实现了注册功能。
实现登录功能
创建一个Session(会话)控制器用来处理用户登录和退出:
railsgcontrollersessionsnewcreate
这里在sessions控制器上默认创建了2个方法:
- new:用来处理登录界面
- create用来处理登录流程
跟注册一样,需要修改create的默认路由为post:
#config/routes.rb post'sessions/create'
完成会话控制器的功能:
#app/controllers/sessions_controller.rb classSessionsController<ApplicationController defnew end defcreate user=User.find_by(name:user_params[:name]).try(:authenticate,user_params[:password]) ifuser renderplain:sprintf("welcome,%s!",user.name) else flash.now[:login_error]="invalidusernameorpassword" render"new" end end private defuser_params params.require(:session).permit(:name,:password) end end
完成会话登录界面:
<!--app/views/sessions/new.html.erb--> <h1>登录</h1> <%ifflash[:login_error]%> <p><%=flash[:login_error]%></p> <%end%> <%=form_for:session,url::sessions_createdo|f|%> <p> <%=f.label:name%> <%=f.text_field:name%> </p> <p> <%=f.label:password%> <%=f.password_field:password%> </p> <p><%=f.button"登录"%></p> <%end%>