新建好项目之后就能够开始写blog了,如今先实现用户的登陆和注册功能。 html
我使用的是sqlite数据库,是rails默认的,因此不用配置,若是使用mysql等的,就要在/config/database.yml中进行配置,具体我就不讲了(由于我也没有配过) mysql
首先要新建一个数据表,命名为User,包含字段account(String),password(String),name(String),email(String) sql
步骤以下: 数据库
一、进入项目根目录,使用命令rails g model User account:string password:string name:string email:string,而后会自动仙剑一些文件夹,接着输入rake db:migrate迁移文件。 ruby
二、编写保存数据逻辑,我在醒目中新建了一个Users的controller,另外也在以前新建的Home中也加上了一些方法(使用rails g controller命令新建,具体请看上一篇) session
建好的controller以下 函数
class HomeController < ApplicationController def index end def login end def checkLogin end def logout end end
class UsersController < ApplicationController def new end def create end end
config/routes.rb中要配好路径 post
MyBlog::Application.routes.draw do post "users/create" get "users/new" get "home/index" get "home/login" post "home/checkLogin" get "home/logout" root 'home#index' end
要确认有对应的view存在,如UsersController的new方法对应这views/users/new.html.erb文件,没有的话就使用重定向(例如:redirect_to :controller=>'home',:action=>'index'重定向到HomeController的index方法) url
在views/home/index.html.erb中写入一下内容 spa
<html> <head> <title>Welcome</title> <meta charset='utf8'> </head> <body> <div> <%=link_to '注册',:controller=>'users',:action=>'new' %> <%=link_to '登陆',:controller=>'home',:action=>'login' %> </div> </body> </html><%=l ink_to %>是相似与<a></a>的标签,以注册为例转化为html就是<a href="users/new">注册</a>
如今先作注册部分,在UsersController的new方法中添加一下内容
def new @user = User.new end意思是建立一个User类(就是以前建立的model类User)
而后在/views/users/new.html.erb中写入一下内容
<html> <head> <title>注册</title> <meta charset = 'utf8'> </head> <body> <%= form_for(@user,:url=>"/users/create") do |f| %> <div class="field"> <%= f.label :account %><br> <%= f.text_field :account %> </div> <div class="field"> <%= f.label :password %><br> <%= f.text_field :password %> </div> <div class="field"> <%= f.label :name %><br> <%= f.text_field :name %> </div> <div class="field"> <%= f.label :email %><br> <%= f.text_field :email %> </div> <div class="actions"> <%= f.submit %> </div> <% end %> </body> </html>注意:因为使用了表单提交数据,因此routes.rb中的create的路径要用post,用rails的form标签,不然会报错。
原理(我本身理解的,若是有错误请指出。。。)
点击注册按钮会定向到UsersController的new方法,在这里会新建一个user,而且传递到new.html.erb中
<%= form_for(@user ,:url=>"/users/create") do |f| %>应该是用f代替user,提交的数据传递到/users/create中,
<div class="field"> <%= f.label :account %><br> <%= f.text_field :account %> </div>
转化为html就是
<div class="field"> <label for="user_account">Account</label><br> <input id="user_account" name="user[account]" type="text"> </div>这样界面就完成了,而后要实现数据保存的逻辑,及/users/ceate,代码以下
def create params.permit! @user = User.new(params[:user]) if @user.save session['loginedUser'] = @user redirect_to :controller=>'home',:action=>'index' else redirect_to :controller=>'home',:action=>'registration' end end注意这一句,params.permit!,新版本的rails若是不加上这一句的话会报错的
从new.html.erb中那个传来的数据重新包装成User,保存到数据库中(使用@user.save,会返回boolean),若是成功就保存在session中(session["loginedUser"]=@user)而后跳转到/home/index,不然跳转到/users/new重新注册
到此,保存部分已经完成了。。。。
而后就是登陆部分
页面login.html.erb的代码以下
<html> <head> <title>登陆</title> <meta charset = 'utf8'> </head> <body> <%= form_for(:user,:url=>"/home/checkLogin") do |f| %> <div class="field"> <%= f.label :account %><br> <%= f.text_field :account %> </div> <div class="field"> <%= f.label :password %><br> <%= f.text_field :password %> </div> <div class="actions"> <%= f.submit %> </div> <% end %> <%=link_to '返回',:action=>'index',:controller=>'home'%> </body> </html>跟注册的差很少,只是把form_for中的@user改为了:user,url改成"/home/checkLogin"(注意在routes.rb中的对应的路径也要改成post)
登陆部分用到的函数是login和checkLogin,代码以下
def login end def checkLogin @user = User.find_by_account(params[:user][:account]) if @user != nil && @user[:password] == params[:user][:password] session['loginedUser'] = @user redirect_to :controller=>'home',:action=>'index' else session['loginedUser'] = nil redirect_to :controller=>'home',:action=>'login' end end因为login只是要跳转到login.html.erb中,因此不用加逻辑
在checkLogin中根据从页面传来的参数查找数据库,根据account来查找user能够使用User.find_by_account(account)来查找,这个rails已经那个封装好了,一样,若是根据name来查找的话就用User.find_by_name(name),若是查找成功就返回(之查找一个)没有就分会nil(注意是nil,不是null)
加入要接受从页面传来的参数,能够使用params[]来获取,例如我要获取user中的account就用params[:user][:account],
登陆成功就把user记录到session中而且跳转到/home/index,不然就继续login
到此登陆都作好了。。。。
最后就加一点小功能吧,就是动态改变/home/index中的界面(登陆前和登陆后有两个界面)
先在HomeController中的index方法加上这一句
def index @user = session['loginedUser'] end就是从session中取出loginedUser,若是没有就是nil
在logout方法中添加一下内容
def logout session['loginedUser'] = nil redirect_to :controller=>'home',:action=>'index' end清除session
而后是index.html.erb中,修改以下
<html> <head> <title>Welcome</title> <meta charset='utf8'> </head> <body> <div> <% if @user==nil %> <%=link_to '注册',:controller=>'users',:action=>'new' %> <%=link_to '登陆',:controller=>'home',:action=>'login' %> <% else %> <%=link_to @user[:name] %> <%=link_to '注销', :controller=>'home',:action=>'logout' %> <% end %> </div> </body> </html>
页面中用来if来判断,若是@user是nil,及说明没有登陆或者注册,就显示登陆和注册,不然显示用户姓名和注销按钮。
好了。。。。。。今天到此结束,休息去了!!!!!!!!!!!!!!!!!!!!!!!!