新建好项目以后就可以开始写blog了,现在先实现用户的登录和注册功能。
我使用的是sqlite数据库,是rails默认的,所以不用配置,如果使用mysql等的,就要在/config/database.yml中进行配置,具体我就不讲了(因为我也没有配过)
首先要新建一个数据表,命名为User,包含字段account(String),password(String),name(String),email(String)
步骤如下:
1、进入项目根目录,使用命令rails g model User account:string password:string name:string email:string,然后会自动仙剑一些文件夹,接着输入rake db:migrate迁移文件。
2、编写保存数据逻辑,我在醒目中新建了一个Users的controller,另外也在之前新建的Home中也加上了一些方法(使用rails g controller命令新建,具体请看上一篇)
建好的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中要配好路径
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方法)
在views/home/index.html.erb中写入一下内容
<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,及说明没有登录或者注册,就显示登录和注册,否则显示用户姓名和注销按钮。
好了。。。。。。今天到此结束,休息去了!!!!!!!!!!!!!!!!!!!!!!!!