Computer >> Máy Tính >  >> Lập trình >> Ruby

Khám phá Devise, Phần 2

Giới thiệu

Trong phần đầu tiên của hướng dẫn, chúng ta đã học cách cài đặt Devise và thiết lập nó trong ứng dụng Rails của chúng ta. Trong phần này, chúng ta sẽ xem xét cách tích hợp DeviseInvitable.

DeviseInvitable là một phần mở rộng hoạt động với Devise. Với DeviseInvitable trong ứng dụng của bạn, người dùng của bạn có thể mời bạn bè của họ qua email. Đây là một tính năng tuyệt vời để đưa vào ứng dụng của bạn nếu bạn đang xây dựng một ứng dụng cộng tác.

Thiết lập DeviseInvitable

Mở Gemfile của bạn và thêm đá quý:

#Gemfile
...
gem 'devise_invitable'

Chạy lệnh để cài đặt bundle install .

Chạy lệnh trình tạo để thêm tùy chọn cấu hình của DeviseInvitable vào tệp cấu hình Devise.

rails generate devise_invitable:install

Bạn có thể xem những thay đổi mới bằng cách xem config/initializers/devise.rb bằng trình soạn thảo văn bản của bạn.

Tiếp theo, hãy thêm DeviseInvitable vào User của chúng tôi mô hình.

rails generate devise_invitable User

Thao tác này sẽ thêm :invitable gắn cờ cho mô hình của bạn, do đó mô hình Người dùng của bạn sẽ giống như sau:

#app/models/user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :invitable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

Chạy lệnh trên cũng tạo ra một tệp di chuyển trông giống như những gì tôi có bên dưới:

class DeviseInvitableAddToUsers < ActiveRecord::Migration
  def up
    change_table :users do |t|
      t.string     :invitation_token
      t.datetime   :invitation_created_at
      t.datetime   :invitation_sent_at
      t.datetime   :invitation_accepted_at
      t.integer    :invitation_limit
      t.references :invited_by, polymorphic: true
      t.integer    :invitations_count, default: 0
      t.index      :invitations_count
      t.index      :invitation_token, unique: true # for invitable
      t.index      :invited_by_id
    end
  end

  def down
    change_table :users do |t|
      t.remove_references :invited_by, polymorphic: true
      t.remove :invitations_count, :invitation_limit, :invitation_sent_at, :invitation_accepted_at, :invitation_token, :invitation_created_at
    end
  end
end

Bây giờ di chuyển cơ sở dữ liệu của bạn bằng cách chạy rake db:migrate .

Định cấu hình Bộ điều khiển cho DeviseInvitable

DeviseInvitable được yêu cầu chuyển một số tham số khi gửi lời mời. Để điều này hoạt động, chúng ta cần đưa tham số cần thiết vào danh sách trắng sẽ được sử dụng. Sử dụng trình soạn thảo văn bản của bạn, điều hướng đến app/controllers/application_controller.rb và làm cho của bạn trông giống như những gì tôi có bên dưới:

#app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    added_attrs = [:username, :email, :password, :password_confirmation, :remember_me]
    devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
    devise_parameter_sanitizer.permit :account_update, keys: added_attrs
    devise_parameter_sanitizer.permit :accept_invitation, keys: [:email]
  end
end

Từ phía trên, bạn có thể thấy rằng :email đã được đưa vào danh sách trắng cho DeviseInvitable.

Bây giờ chúng ta hãy xem những gì chúng tôi có thông qua bảng điều khiển của chúng tôi. Trên thiết bị đầu cuối của bạn, chạy rails console và nhập những gì bạn có bên dưới.

[1] pry(main)> User.invite!(:email => "johndoe@example.com")

Nó sẽ tạo ra kết quả giống như những gì tôi có bên dưới, mặc dù sẽ có sự khác biệt.

[2] pry(main)> User Load (78.3ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["email", "johndoe@example.com"]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."invitation_token" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["invitation_token", "658da470d5fcbb2275f30bc1fb66f5771b889cec2f1e56f536319d2fd1ef4a92"]]
   (0.1ms)  begin transaction
  SQL (67.8ms)  INSERT INTO "users" ("email", "encrypted_password", "invitation_token", "invitation_created_at", "invitation_sent_at", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?)  [["email", "johndoe@example.com"], ["encrypted_password", "$2a$11$0sLfqvfFDsebcmcQTUXzlOuqNIooL5z8niXeza8OUwNK3gZY/iRum"], ["invitation_token", "658da470d5fcbb2275f30bc1fb66f5771b889cec2f1e56f536319d2fd1ef4a92"], ["invitation_created_at", "2016-10-07 07:41:51.254047"], ["invitation_sent_at", "2016-10-07 07:41:51.254047"], ["created_at", "2016-10-07 07:41:51.255700"], ["updated_at", "2016-10-07 07:41:51.255700"]]
   (220.5ms)  commit transaction
  Rendered /home/kinsomicrote/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise_invitable-1.7.0/app/views/devise/mailer/invitation_instructions.html.erb (2.5ms)
  Rendered /home/kinsomicrote/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise_invitable-1.7.0/app/views/devise/mailer/invitation_instructions.text.erb (88.0ms)

Devise::Mailer#invitation_instructions: processed outbound mail in 247.1ms

Sent mail to johndoe@example.com (74.3ms)
Date: Fri, 07 Oct 2016 08:41:51 +0100
From: please-change-me-at-config-initializers-devise@example.com
Reply-To: please-change-me-at-config-initializers-devise@example.com
To: johndoe@example.com
Message-ID: <57f751bfce8d6_18022ac6c272b12840661@kinsomicrote-X553MA.mail>
Subject: Invitation instructions
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_57f751bfcc725_18022ac6c272b12840524";
 charset=UTF-8
Content-Transfer-Encoding: 7bit


----==_mimepart_57f751bfcc725_18022ac6c272b12840524
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

Hello johndoe@example.com

Someone has invited you to https://localhost:3000/, you can accept it through the link below.

https://localhost:3000/users/invitation/accept?invitation_token=xmW9uRfyafptmeFMmFBy


If you don't want to accept the invitation, please ignore this email.
Your account won't be created until you access the link above and set your password.

----==_mimepart_57f751bfcc725_18022ac6c272b12840524
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

<p>Hello johndoe@example.com</p>

<p>Someone has invited you to https://localhost:3000/, you can accept it through the link below.</p>

<p><a href="https://localhost:3000/users/invitation/accept?invitation_token=xmW9uRfyafptmeFMmFBy">Accept invitation</a></p>


<p>If you don't want to accept the invitation, please ignore this email.<br />
Your account won't be created until you access the link above and set your password.</p>

----==_mimepart_57f751bfcc725_18022ac6c272b12840524--

=> #<User:0x00558d875fa798
 id: 4,
 email: "johndoe@example.com",
 encrypted_password: "$2a$11$0sLfqvfFDsebcmcQTUXzlOuqNIooL5z8niXeza8OUwNK3gZY/iRum",
 reset_password_token: nil,
 reset_password_sent_at: nil,
 remember_created_at: nil,
 sign_in_count: 0,
 current_sign_in_at: nil,
 last_sign_in_at: nil,
 current_sign_in_ip: nil,
 last_sign_in_ip: nil,
 created_at: Fri, 07 Oct 2016 07:41:51 UTC +00:00,
 updated_at: Fri, 07 Oct 2016 07:41:51 UTC +00:00,
 username: nil,
 invitation_token: "658da470d5fcbb2275f30bc1fb66f5771b889cec2f1e56f536319d2fd1ef4a92",
 invitation_created_at: Fri, 07 Oct 2016 07:41:51 UTC +00:00,
 invitation_sent_at: Fri, 07 Oct 2016 07:41:51 UTC +00:00,
 invitation_accepted_at: nil,
 invitation_limit: nil,
 invited_by_id: nil,
 invited_by_type: nil,
 invitations_count: 0>
[3] pry(main)> 

Điều đó đã hoạt động như kế hoạch.

Bạn không muốn người dùng của chúng tôi gửi lời mời qua dòng lệnh, vì vậy, điều quan trọng là chúng tôi phải thiết lập DeviseInvitable để hoạt động trên giao diện người dùng. Làm điều này rất đơn giản; chạy lệnh trình tạo để tạo các chế độ xem cho DeviseInvitable.

rails generate devise_invitable:views users

Bạn cũng sẽ cần thêm một liên kết ở đâu đó trong ứng dụng của mình trỏ đến trang để gửi lời mời (app/views/users/invitations/new.html.erb ).

Đối với ứng dụng này, bạn có thể tiếp tục và thêm liên kết vào tệp điều hướng của mình. Đây là cách tôi đã làm của tôi:

#app/views/shared/_navigation.html.erb

<nav class="navbar navbar-inverse">
  <div class="container">
    <div class="navbar-header">
      <%= link_to 'Tutsplus Devise', root_path, class: 'navbar-brand' %>
    </div>
    <div id="navbar">
      <ul class="nav navbar-nav">
        <li><%= link_to 'Home', root_path %></li>
      </ul>
      <ul class="nav navbar-nav pull-right">
        <% if user_signed_in? %>
          <li class="dropdown">
            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
              <%= current_user.username %>
              <span class="caret"></span>
            </a>
            <ul class="dropdown-menu" role="menu">
              <li><%= link_to 'Invite', new_user_invitation_path %></li>
              <li><%= link_to 'Profile', edit_user_registration_path %></li>
              <li><%= link_to 'Log out', destroy_user_session_path, method: :delete %></li>
            </ul>
          </li>
        <% else %>
          <li><%= link_to 'Log In', new_user_session_path %></li>
          <li><%= link_to 'Sign Up', new_user_registration_path %></li>
        <% end %>
      </ul>
    </div>
  </div>
</nav>

Để xem các tuyến đường được cung cấp bởi DeviseInvitable, hãy chạy lệnh rake routes | invit . Đây là kết quả đầu ra sẽ như thế nào.

cancel_user_registration GET    /users/cancel(.:format)            devise_invitable/registrations#cancel
       user_registration POST   /users(.:format)                   devise_invitable/registrations#create
   new_user_registration GET    /users/sign_up(.:format)           devise_invitable/registrations#new
  edit_user_registration GET    /users/edit(.:format)              devise_invitable/registrations#edit
                         PATCH  /users(.:format)                   devise_invitable/registrations#update
                         PUT    /users(.:format)                   devise_invitable/registrations#update
                         DELETE /users(.:format)                   devise_invitable/registrations#destroy
  accept_user_invitation GET    /users/invitation/accept(.:format) devise/invitations#edit
  remove_user_invitation GET    /users/invitation/remove(.:format) devise/invitations#destroy
         user_invitation POST   /users/invitation(.:format)        devise/invitations#create
     new_user_invitation GET    /users/invitation/new(.:format)    devise/invitations#new
                         PATCH  /users/invitation(.:format)        devise/invitations#update
                         PUT    /users/invitation(.:format)        devise/invitations#update

Hãy để chúng tôi xem những gì chúng tôi có vào thời điểm này. Chạy lệnh để khởi động máy chủ của bạn; rails server .

Trỏ trình duyệt của bạn tới https://localhost:3000/users/invitation/new . Nhập địa chỉ email vào biểu mẫu được hiển thị và nhấp vào nút. Cần làm việc! Nếu bạn truy cập nhật ký của máy chủ của mình, bạn sẽ thấy đầu ra được tạo khi bạn gửi lời mời. Trong đầu ra, bạn sẽ thấy một liên kết để chấp nhận lời mời.

Bạn sẽ đồng ý với tôi rằng sẽ tốt hơn nếu bạn có thể xem email được gửi trong trình duyệt của mình. Hãy để chúng tôi xem cách thực hiện điều đó.

Tích hợp Letter_Opener

Công cụ mở thư cho phép bạn xem trước email trong trình duyệt mặc định của mình. Với nó, bạn không phải thiết lập hệ thống gửi thư khi làm việc trong môi trường phát triển.

Mở Gemfile của bạn và thêm đá quý bên dưới:

gem 'letter_opener'

Chạy bundle install .

Sử dụng trình soạn thảo văn bản của bạn, điều hướng đến config/environments/development.rb và thêm dòng bên dưới.

#config/environments/development.rb
...
  config.action_mailer.delivery_method = :letter_opener
end

Khởi động lại máy chủ rails của bạn. Bây giờ, hãy trỏ trình duyệt của bạn tới https://localhost:3000/users/invitation/new . Điền và gửi biểu mẫu được hiển thị. Lần này, một trang mới bật lên chứa email mời.

Thay đổi lộ trình đăng nhập và đăng xuất mặc định

Theo mặc định, sign_insign_out các tuyến khi sử dụng Devise trông giống như sau:

sign_in: https://localhost:3000/users/sign_in

sign_out: https://localhost:3000/users/sign_out

Để thay đổi nó, hãy truy cập config/routes.rb và thêm phần sau:

#config/routes.rb
  as :user do
    get 'signin' => 'devise/sessions#new'
    post 'signin' => 'devise/sessions#create'
    delete 'signout' => 'devise/sessions#destroy'
  end

Bạn có thể trỏ trình duyệt của mình tới https://localhost:3000/signin .

Kết luận

Bây giờ bạn đã biết cách sử dụng DeviseInvitable. Bạn cũng đã tìm hiểu về đá quý letter_opener . Có rất nhiều điều bạn có thể làm với Devise, vì vậy hãy xem Wiki để tìm hiểu thêm. Cảm ơn vì đã ở lại với tôi.