Ruby学习笔记7: 添加身份验证(adding Authentication)
我们已经完成了Category & Product页面内容的增删改查,再加入一个身份验证即可成为一个较完整的Rails App了。本文就来完成这个任务。
We now need to give users the ability to sign up for the app so that they can do things like purchase products or leave reviews.
To do this, we'll add a user authentication system to the app.看下图:
1. install a gem called Devise.
Earlier, we learned about bundler and how it sets up our gems. To add authentication, we'll install a gem called Devise.
We've gone ahead and added Devise for you in your Gemfile. Run bundle to install it in your app.
1. In your terminal, run
bundle install
to update all your gems. Press Enter.
这个命令看起来好像是依托于一个叫做GemFile的文件的:
source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.1.1'
# Use sqlite3 as the database for Active Record
gem 'sqlite3', '1.3.9'
# Use SCSS for stylesheets
gem 'sass-rails', '4.0.3'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '1.3.0'
# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '4.0.0'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby gem 'paperclip', '4.2.0' # Use jquery as the JavaScript library
gem 'jquery-rails', '3.1.2'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks', '2.4.0'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '2.2.2'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '0.4.0', group: :doc # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring', '1.1.3', group: :development # Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7' # Use unicorn as the app server
# gem 'unicorn' # Use Capistrano for deployment
# gem 'capistrano-rails', group: :development # Use debugger
# gem 'debugger', group: [:development, :test] gem 'rspec', '3.1'
gem 'rspec-rails', '3.1'
gem 'rspec-context-private', '0.0.1'
gem 'rspec-html-matchers', '0.6.1' gem 'devise', '3.4.0'
运行那个命令以后就进入第二步。
以下是运行的部分结果打印:
$ bundle install
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
Using rake 10.3.2
Using i18n 0.6.11
....
2. Create configuration files - for setup
Devise also comes with a generator that allows us to configure the gem. Devise附带了一个generator,我们可以用它来配置the gem.This is similar to how we generated our Model for Categories and Products. This time we'll be using Devise's built in setup feature.
这次我们要用Devise的自带的setup feature.
1. In your terminal,
rails generate devise:install
which will create configuration files for us. Press Enter.
$ rails generate devise:install
create config/initializers/devise.rb
create config/locales/devise.en.yml
===============================================================================
$
3. Generate devise for user model and routes
In order to let users sign up for the app, we need a place to safely store their information.
我们在前面也见到这个问题,当我们需要一个地方来store category & product信息时,我们建立了Category & Product Models. 这里是一样的,把信息存在User Model里。devise 跟了一个命令就是拿来建立user model的,下面就要来了:
1. In your terminal, type
rails generate devise user
which will create our user model. Press Enter.
$ rails generate devise user
invoke active_record
create db/migrate/20141015022653_devise_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
insert app/models/user.rb
route devise_for :users
$
In addition to creating a User model, Devise also created a route to sign up new users. Let's see what
this route looks like.
***file:**config/routes.rb:
Rails.application.routes.draw do
get '/' => 'pages#home' resources :categories
get 'categories/:id/delete' => 'categories#delete', :as => :categories_delete resources :products
get 'products/:id/delete' => 'products#delete', :as => :products_delete devise_for :users #the routes for users created by advise
end
4. Migrate database
In our Model, we can see that Devise adds a number of words ending in 'able'. These are different functionalities that we can add to our app, like registering new users and remembering them.
In our Migration file, we can see that Devise has added new columns for each module it created. The Migration table works similar to the ones we created earlier, storing new features.
*** file: app/models/user.rb:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
1.In your terminal, run
bundle exec rake db:migrate
to migrate your database. Press Enter.
$ bundle exec rake db:migrate
== 20140929235235 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0055s
-- add_index(:users, :email, {:unique=>true})
-> 0.0008s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0025s
== 20140929235235 DeviseCreateUsers: migrated (0.0090s) =======================
5. Create our First User
Now that the User Model is set up, let's create our first user. This is similar to what we did earlier for Products and Categories.
We can do this by adding an email, password, and password_confirmation in seeds.rb:
user = User.create(email: 'name@name.com', password: 'password1', password_confirmation: 'password1')
Instructions
In seeds.rb, on line 9, add seed data for an
email
, password
, andpassword_confirmation
. The password and password_confirmation must match. Hit Run.
在 ** db/seeds.rb 文件里,加入:
user = User.create(email: 'name@name.com', password: 'password1', password_confirmation: 'password1')
即添加了一个user.
2. In your terminal, run
rake db:seed to seed your database. Press Enter.(实际是: bundle exec rake db:seed)
$ bundle exec rake db:seed
$
6. Complete the TopNav view for costumers
Since our Users will be logging in through the home page we created earlier, we don't need to create separate views.
我们不需要再给用户建立一个登录的view,因为我们首页已经有了。如果不是这样的话,我们要给用户一个区分,看是不是已经登进去了:
i. If a User is signed in, we want to show the Sign Out link.
ii. If a User is signed out, we want to show links that allow users to Sign In or Sign Up.
我们就用if ... else ... 语句,在view里,来完成这个事儿。
if user_signed_in?
On line 28, type current_user.email
.2.Use an else statement to display the sign in or sign up options. To do this add an
else
statement on line 31, and an end
statement on line 34.
file ** app/views/shared/_topnav.html.erb:
<!--=== Top ===-->
<div class="browse">
<div class="container">
<ul>
<li>Art</li>
<li>Home & Living</li>
<li>Jewelry</li>
<li>Books & Music</li>
<li>Women</li>
<li>Men</li>
<li>Kids</li>
<li>Vintage</li>
<li>Weddings</li>
<li>Crafts</li>
</ul>
</div>
</div> <div class="top">
<div class="container">
<div class="logo">
<img src="https://www.etsy.com/assets/dist/images/etsylogo.20140703190113.png">
</div>
<div>
<ul class="header-nav">
<% if user_signed_in? %><!--# add your if statement here %>-->
Logged in as <strong>
<%= current_user.email%> <!--# print out user email %>-->
</strong>.
<%= link_to "Sign out", destroy_user_session_path, method: :delete, :class => "btn btn-default" %>
<% else %> <!--#complete this %>-->
<%= link_to "Sign up", new_user_registration_path, :class => "btn btn-default" %>
<%= link_to "Sign in", new_user_session_path, :class => "btn btn-default" %>
<% end %> <!--#complete this %>-->
<li class="account">
<div class="cart pull-right">
<div class="fa fa-shopping-cart fa-2x">
</div>
</div>
</li>
</ul>
</div>
</div>
===================
7. 大结局
We're finally ready to try out our authentication system! In your browser try to sign in with your email and the password you stored in your seeds file.
In your browser, visit localhost:8000 and sign in with your email and encrypted password.
但是我们这里得到了一个 No Method Error:
一个错误的结局,就是下一步努力的开始。Yeah!但是我还是得到了Codecademy.com颁发的荣誉证书:
Ruby学习笔记7: 添加身份验证(adding Authentication)的更多相关文章
- Ruby学习笔记4: 动态web app的建立
Ruby学习笔记4: 动态web app的建立 We will first build the Categories page. This page contains topics like Art, ...
- 用Retrofit发送请求中添加身份验证
用Retrofit发送请求中添加身份验证====================在安卓应用开发中, retrofit可以极大的方便发送http网络请求,不管是GET, POST, 还是PUT, DEL ...
- 初识Identity并添加身份验证管理页面
目录 初识Identity并添加身份验证管理页面 前言 什么是ASP.NET Core Identity 创建带有身份验证的WebApp 尝试运行 检查解决方案中的项目文件 发现问题 原因 解决问题 ...
- ruby学习笔记(1)-puts,p,print的区别
ruby学习笔记-puts,p,print的区别 共同点:都是用来屏幕输出的. 不同点:puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号):另外如果内容参数中有转义符,输出时将 ...
- Django:学习笔记(9)——用户身份认证
Django:学习笔记(9)——用户身份认证 User
- R语言可视化学习笔记之添加p-value和显著性标记
R语言可视化学习笔记之添加p-value和显著性标记 http://www.jianshu.com/p/b7274afff14f?from=timeline 上篇文章中提了一下如何通过ggpubr ...
- 为WebService添加身份验证的两种方法
方法一:SoapHeader 辅助类:MySoapHeader //SoapHeader 添加引用 using System.Web.Services.Protocols; #region 配置登录标 ...
- Ruby学习笔记6: 动态web app的建立(3)--多Model之间的交互
We first built a static site which displayed a static image using only a Controller and a View. This ...
- Shiro学习(2)身份验证
身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...
随机推荐
- SSH实现隧道功能穿墙
Putty和SSH tunnel 目前寻求FQ的方式无非就几种: 寻找web代理(这个可以进我放置的在线代理进行测试) 自行寻找http/sock5代理(这个可以去网上搜索代理ip) vpnFQ(目前 ...
- 获取 TUniConnection.SpecificOptions默认值和下拉框列表值
TUniConnection的SpecificOptions参数决定了数据库连接配置参数,但可惜的是,SpecificOptions设计器界面,Devart公司只能让它在设计期配置! Specific ...
- Thinkphp 缓存和静态缓存局部缓存设置
1.S方法缓存设置 if(!$rows = S('indexBlog')){ //*$rows = S('indexBlog') $rows = D('blog')->select(); S(' ...
- 黄聪:初识Pjax:pjax是什么
听说博主不再折腾wordpress了,陌小雨还是转载到网站做个备份吧,万一哪天没有了呢.陌小雨觉得讲的挺清楚的,小白都能懂. pjax是 pushstate + ajax,分别百度可以得到相关资料,在 ...
- Hadoop错误集:Could not find the main class: org.apache.hadoop.*
在搭建Hadoop机群的时候,之前遇见了很多次找不到类的错误,因为对Hadoop了解不深,所以就在网上漫无目的的找解决方案,所以这里总结下我用的方法. 解决办法一: 我之前遇到了找不到 org.apa ...
- Redis的5中数据类型
Radis的作用相信既然然就就知道她的作用,但是对于刚开始对radis学习的初学者来说,理解起来比较费劲.这里就从开始一步步认识radis 首先要知道radis是存在内存中的数据,所以读取速度回更改, ...
- 2.C++语言特性
一.普遍编程语言的特征 任何常用的编程语言都具备一组公共的语法特征,不同的语言仅在特征的细节上有所区别.所以,要想掌握一门语言,需要理解其语法特征的实现细节是第一步. 最基本的特征包括: ...
- SQL优化系列——索引
索引可能是数据库中最被误解的主题,因为有很多方式让你糊涂索引如何工作,以及服务器如何使用它们.要正确设计索引,让索引在数据库服务器中满足以下三个重要目的:1,索引使服务器查找一组相邻行,而不是单独的行 ...
- vue之v-on
我们可以用 v-on 指令绑定一个事件监听器,通过它调用我们 Vue 实例中定义的方法: <!DOCTYPE html> <html lang="en"> ...
- Linux rpm包安装MySQL数据库问题总结
1.安装包准备 2.按顺序安装以下安装包 一定要按顺序安装,因为前面的包是后面包的依赖 [root@iz2ze1bzpi3orra8lboxqiz mysql]# rpm -ivh Percona-S ...