新建好项目以后就可以开始写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,及说明没有登录或者注册,就显示登录和注册,否则显示用户姓名和注销按钮。
好了。。。。。。今天到此结束,休息去了!!!!!!!!!!!!!!!!!!!!!!!!