zoukankan      html  css  js  c++  java
  • 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.

    【Instructions】
    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.

    [Instructions]
    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的,下面就要来了:

    【Instructions】
    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

    [Instructions]
    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
    1. In seeds.rb, on line 9, add seed data for an email, password, and password_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里,来完成这个事儿。

    1.Use an if statement to see if a user is signed in with their current user email. To do this line 27, check 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颁发的荣誉证书:

     



  • 相关阅读:
    lambda表达式
    PAT 1071. Speech Patterns
    PAT 1070. Mooncake
    1069. The Black Hole of Numbers
    PAT 1068. Find More Coins
    背包问题(动态规划)
    PAT 1067. Sort with Swap(0,*)
    PAT 1066. Root of AVL Tree
    PAT 1065. A+B and C
    PAT 1064. Complete Binary Search Tree
  • 原文地址:https://www.cnblogs.com/sonictl/p/6735558.html
Copyright © 2011-2022 走看看