【写给朱大虫的教程】【Ruby on Rails】【006】遵循Rails理念的快速实现
前言:
上兩節我們講了用戶的添加、登錄……,這一次我們遵循Rails的理念,快速實現用戶的注冊、登錄……
理念:
1、少就是多
2、不要重復制造輪子
開始:
1、新建rails工程
$ rails new r2 -d=mysql配置Gemfile文件,添加一句:
gem 'devise' #devise是一個gem包配置config/database.yml文件,修改適合自己的數據庫名、用戶名和密碼。
$ bundle install $ rake db:create #創建數據庫解釋:
2、配置devise
(1)應用devise:
$ rails g devise:install輸出如下:
===============================================================================Some setup you must do manually if you haven't yet:1. Setup default url options for your specific environment. Here is anexample of development environment:config.action_mailer.default_url_options = { :host => 'localhost:3000' }This is a required Rails configuration. In production it must be theactual host of your application2. Ensure you have defined root_url to *something* in your config/routes.rb.For example:root :to => "home#index"3. Ensure you have flash messages in app/views/layouts/application.html.erb.For example:<p class="notice"><%= notice %></p><p class="alert"><%= alert %></p>===============================================================================以上提示,我們后面再做理會!
(2)使用devise創建user model:
$ rails g devise User發生了什么?
(3)配置user
編輯app/models/user.rb文件
class User < ActiveRecord::Base# Include default devise modules. Others available are:# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthabledevise :database_authenticatable, :registerable,:recoverable, :rememberable, :trackable, :validatable, #末尾添加,號:confirmable, :lockable #添加這一行# Setup accessible (or protected) attributes for your modelattr_accessible :email, :password, :password_confirmation, :remember_me end編輯db/migrate/20110726xxxxxx_devise_create_users.rb文件
class DeviseCreateUsers < ActiveRecord::Migrationdef self.upcreate_table(:users) do |t|t.database_authenticatable :null => falset.recoverablet.rememberablet.trackable#添加以下兩行t.confirmablet.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both# t.encryptable# t.confirmable# t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both# t.token_authenticatablet.timestampsendadd_index :users, :email, :unique => trueadd_index :users, :reset_password_token, :unique => true#添加以下兩行add_index :users, :confirmation_token, :unique => trueadd_index :users, :unlock_token, :unique => true# add_index :users, :confirmation_token, :unique => true# add_index :users, :unlock_token, :unique => true# add_index :users, :authentication_token, :unique => trueenddef self.downdrop_table :usersend end生成數據表:
$ rake db:migrate(3)配置郵件服務器
編輯config/initializers/devise.rb
# Use this hook to configure devise mailer, warden hooks and so forth. The first # four configuration values can also be set straight in your models. Devise.setup do |config|# ==> Mailer Configuration# Configure the e-mail address which will be shown in DeviseMailer.config.mailer_sender = "xxx@126.com" #換成你的郵箱,最好不要是gmail# Configure the class responsible to send e-mails.# config.mailer = "Devise::Mailer"# ==> ORM configuration# Load and configure the ORM. Supports :active_record (default) and# :mongoid (bson_ext recommended) by default. Other ORMs may be# available as additional gems.require 'devise/orm/active_record'# ==> Configuration for any authentication mechanism# Configure which keys are used when authenticating a user. The default is# just :email. You can configure it to use [:username, :subdomain], so for# authenticating a user, both parameters are required. Remember that those# parameters are used only when authenticating and not when retrieving from# session. If you need permissions, you should implement that in a before filter.# You can also supply a hash where the value is a boolean determining whether# or not authentication should be aborted when the value is not present.# config.authentication_keys = [ :email ]# Configure parameters from the request object used for authentication. Each entry# given should be a request method and it will automatically be passed to the# find_for_authentication method and considered in your model lookup. For instance,# if you set :request_keys to [:subdomain], :subdomain will be used on authentication.# The same considerations mentioned for authentication_keys also apply to request_keys.# config.request_keys = []# Configure which authentication keys should be case-insensitive.# These keys will be downcased upon creating or modifying a user and when used# to authenticate or find a user. Default is :email.config.case_insensitive_keys = [ :email ]# Configure which authentication keys should have whitespace stripped.# These keys will have whitespace before and after removed upon creating or# modifying a user and when used to authenticate or find a user. Default is :email.config.strip_whitespace_keys = [ :email ]# Tell if authentication through request.params is enabled. True by default.# config.params_authenticatable = true# Tell if authentication through HTTP Basic Auth is enabled. False by default.# config.http_authenticatable = false# If http headers should be returned for AJAX requests. True by default.# config.http_authenticatable_on_xhr = true# The realm used in Http Basic Authentication. "Application" by default.# config.http_authentication_realm = "Application"# It will change confirmation, password recovery and other workflows# to behave the same regardless if the e-mail provided was right or wrong.# Does not affect registerable.# config.paranoid = true# ==> Configuration for :database_authenticatable# For bcrypt, this is the cost for hashing the password and defaults to 10. If# using other encryptors, it sets how many times you want the password re-encrypted.config.stretches = 10# Setup a pepper to generate the encrypted password.# config.pepper = "025e837f7ae23e7f4e3b0a3dd048577e3b82c0f803fc4a8bac896303ab40545ab6e47600962cd8075c3122af0c98dba62bd6399604d622579797c282b0b1b2a1"# ==> Configuration for :confirmable# The time you want to give your user to confirm his account. During this time# he will be able to access your application without confirming. Default is 0.days# When confirm_within is zero, the user won't be able to sign in without confirming.# You can use this to let your user access some features of your application# without confirming the account, but blocking it after a certain period# (ie 2 days).# config.confirm_within = 2.days# Defines which key will be used when confirming an account# config.confirmation_keys = [ :email ]# ==> Configuration for :rememberable# The time the user will be remembered without asking for credentials again.# config.remember_for = 2.weeks# If true, a valid remember token can be re-used between multiple browsers.# config.remember_across_browsers = true# If true, extends the user's remember period when remembered via cookie.# config.extend_remember_period = false# If true, uses the password salt as remember token. This should be turned# to false if you are not using database authenticatable.config.use_salt_as_remember_token = true# Options to be passed to the created cookie. For instance, you can set# :secure => true in order to force SSL only cookies.# config.cookie_options = {}# ==> Configuration for :validatable# Range for password length. Default is 6..128.# config.password_length = 6..128# Regex to use to validate the email address# config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i# ==> Configuration for :timeoutable# The time you want to timeout the user session without activity. After this# time the user will be asked for credentials again. Default is 30 minutes.# config.timeout_in = 30.minutes# ==> Configuration for :lockable# Defines which strategy will be used to lock an account.# :failed_attempts = Locks an account after a number of failed attempts to sign in.# :none = No lock strategy. You should handle locking by yourself.# config.lock_strategy = :failed_attempts# Defines which key will be used when locking and unlocking an account# config.unlock_keys = [ :email ]# Defines which strategy will be used to unlock an account.# :email = Sends an unlock link to the user email# :time = Re-enables login after a certain amount of time (see :unlock_in below)# :both = Enables both strategies# :none = No unlock strategy. You should handle unlocking by yourself.# config.unlock_strategy = :both# Number of authentication tries before locking an account if lock_strategy# is failed attempts.# config.maximum_attempts = 20# Time interval to unlock the account if :time is enabled as unlock_strategy.# config.unlock_in = 1.hour# ==> Configuration for :recoverable## Defines which key will be used when recovering the password for an account# config.reset_password_keys = [ :email ]# Time interval you can reset your password with a reset password key.# Don't put a too small interval or your users won't have the time to# change their passwords.config.reset_password_within = 2.hours# ==> Configuration for :encryptable# Allow you to use another encryption algorithm besides bcrypt (default). You can use# :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1,# :authlogic_sha512 (then you should set stretches above to 20 for default behavior)# and :restful_authentication_sha1 (then you should set stretches to 10, and copy# REST_AUTH_SITE_KEY to pepper)# config.encryptor = :sha512# ==> Configuration for :token_authenticatable# Defines name of the authentication token params key# config.token_authentication_key = :auth_token# If true, authentication through token does not store user in session and needs# to be supplied on each request. Useful if you are using the token as API token.# config.stateless_token = false# ==> Scopes configuration# Turn scoped views on. Before rendering "sessions/new", it will first check for# "users/sessions/new". It's turned off by default because it's slower if you# are using only default views.# config.scoped_views = false# Configure the default scope given to Warden. By default it's the first# devise role declared in your routes (usually :user).# config.default_scope = :user# Configure sign_out behavior.# Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope).# The default is true, which means any logout action will sign out all active scopes.# config.sign_out_all_scopes = true# ==> Navigation configuration# Lists the formats that should be treated as navigational. Formats like# :html, should redirect to the sign in page when the user does not have# access, but formats like :xml or :json, should return 401.## If you have any extra navigational formats, like :iphone or :mobile, you# should add them to the navigational formats lists.## The :"*/*" and "*/*" formats below is required to match Internet# Explorer requests.# config.navigational_formats = [:"*/*", "*/*", :html]# The default HTTP method used to sign out a resource. Default is :delete.config.sign_out_via = :delete# ==> OmniAuth# Add a new OmniAuth provider. Check the wiki for more information on setting# up on your models and hooks.# config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo'# ==> Warden configuration# If you want to use other strategies, that are not supported by Devise, or# change the failure app, you can configure them inside the config.warden block.## config.warden do |manager|# manager.failure_app = AnotherApp# manager.intercept_401 = false# manager.default_strategies(:scope => :user).unshift :some_external_strategy# end end編輯config/environments/development.rb
R2::Application.configure do# Settings specified here will take precedence over those in config/application.rb# In the development environment your application's code is reloaded on# every request. This slows down response time but is perfect for development# since you don't have to restart the webserver when you make code changes.config.cache_classes = false# Log error messages when you accidentally call methods on nil.config.whiny_nils = true# Show full error reports and disable cachingconfig.consider_all_requests_local = trueconfig.action_view.debug_rjs = trueconfig.action_controller.perform_caching = false# Don't care if the mailer can't sendconfig.action_mailer.raise_delivery_errors = true #此處改為true#添加以下內容config.action_mailer.default_url_options = { :host => "localhost:3000" } #剛才devise的提示中提到這一句config.action_mailer.delivery_method = :smtpconfig.action_mailer.smtp_settings = {:address => "smtp.126.com",:port => 25,:domain => "126.com",:authentication => :login,:user_name => "xxx@126.com", #你的郵箱:password => "xxxxxx" #你的密碼}# Print deprecation notices to the Rails loggerconfig.active_support.deprecation = :log# Only use best-standards-support built into browsersconfig.action_dispatch.best_standards_support = :builtin end(4)其它配置
隨便新建一個home controller
$ rails g controller home index刪除public目錄下的index.html文件
修改config/routes.rb文件,添加一句
root :to => "home#index"編輯app/controllers/home_controller.rb文件
class HomeController < ApplicationControllerbefore_filter :authenticate_user! #添加這一句def indexendend編輯app/views/layouts/application.html.erb文件
<!DOCTYPE html> <html> <head><title>R2</title><%= stylesheet_link_tag :all %><%= javascript_include_tag :defaults %><%= csrf_meta_tag %> </head> <body>#添加以下兩句 <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p><%= yield %></body> </html>3、運行程序
啟動工程:
$ rails s瀏覽器輸入:http://localhost:3000
結果轉到了http://localhost:3000/users/sign_in,要求你登錄
我沒有賬戶登錄怎么辦?點擊sign_up注冊賬戶
填寫email、密碼,點擊“sign up ”,不出意外的話去注冊郵箱收取確認郵件吧!
點一下鏈接:
一個注冊、登錄程序就完成了!!!
轉載于:https://www.cnblogs.com/chengguyun/archive/2011/07/26/2117756.html
總結
以上是生活随笔為你收集整理的【写给朱大虫的教程】【Ruby on Rails】【006】遵循Rails理念的快速实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓开发1-初步了解使用
- 下一篇: 面向对象写js