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 => "[email protected]")
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", "[email protected]"]] 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", "[email protected]"], ["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 [email protected] (74.3ms) Date: Fri, 07 Oct 2016 08:41:51 +0100 From: [email protected] Reply-To: [email protected] To: [email protected] Message-ID: <[email protected]> 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 [email protected] 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 [email protected]</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: "[email protected]", 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_in
và sign_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.