แนะนำตัว
ในส่วนแรกของบทช่วยสอน เราได้เรียนรู้วิธีติดตั้ง Devise และตั้งค่าในแอปพลิเคชัน Rails ของเรา ในส่วนนี้ เราจะมาดูวิธีผสานรวม DeviseInvitable
DeviseInvitable เป็นส่วนขยายที่ทำงานร่วมกับ Devise ด้วย DeviseInvitable ในแอปพลิเคชันของคุณ ผู้ใช้ของคุณสามารถเชิญเพื่อนผ่านอีเมลได้ นี่เป็นคุณลักษณะที่ยอดเยี่ยมที่จะรวมไว้ในแอปพลิเคชันของคุณ หากคุณกำลังสร้างแอปการทำงานร่วมกัน
การตั้งค่า DeviseInvitable
เปิด Gemfile
. ของคุณ และเพิ่มอัญมณี:
#Gemfile ... gem 'devise_invitable'
เรียกใช้คำสั่งเพื่อติดตั้ง bundle install
.
เรียกใช้คำสั่งตัวสร้างเพื่อเพิ่มตัวเลือกการกำหนดค่าของ DeviseInvitable ให้กับไฟล์การกำหนดค่า Devise
rails generate devise_invitable:install
คุณสามารถดูการเปลี่ยนแปลงใหม่ได้โดยดูที่ config/initializers/devise.rb
ด้วยโปรแกรมแก้ไขข้อความของคุณ
ต่อไป มาเพิ่ม DeviseInvitable ให้กับ User
. ของเรา รุ่น
rails generate devise_invitable User
สิ่งนี้จะเพิ่ม :invitable
ตั้งค่าสถานะโมเดลของคุณ ดังนั้น โมเดลผู้ใช้ของคุณจะมีลักษณะดังนี้:
#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
การเรียกใช้คำสั่งดังกล่าวจะสร้างไฟล์การโยกย้ายที่ดูเหมือนว่ามีดังต่อไปนี้:
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
ตอนนี้ย้ายฐานข้อมูลของคุณโดยเรียกใช้ rake db:migrate
.
การกำหนดค่าคอนโทรลเลอร์สำหรับ DeviseInvitable
DeviseInvitable จำเป็นต้องส่งผ่านพารามิเตอร์บางอย่างเมื่อส่งคำเชิญ เพื่อให้ใช้งานได้ เราต้องอนุญาตพารามิเตอร์ที่จำเป็นที่จะใช้ ใช้เครื่องมือแก้ไขข้อความ ไปที่ app/controllers/application_controller.rb
และทำให้คุณดูเหมือนสิ่งที่ฉันมีด้านล่าง:
#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
จากด้านบน คุณจะเห็นว่า :email
ได้รับการอนุญาตพิเศษสำหรับ DeviseInvitable
ตอนนี้เรามาดูกันว่าเรามีอะไรผ่านคอนโซลของเราบ้าง บนเทอร์มินัลของคุณ ให้เรียกใช้ rails console
และป้อนสิ่งที่คุณมีด้านล่าง
[1] pry(main)> User.invite!(:email => "[email protected]")
มันควรจะสร้างผลลัพธ์ที่ดูเหมือนว่าฉันมีด้านล่าง แม้ว่าจะมีความแตกต่างกัน
[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)>
ได้ผลตามแผนที่วางไว้
คุณไม่ต้องการให้ผู้ใช้ของเราส่งคำเชิญผ่านบรรทัดคำสั่ง ดังนั้นเราจึงตั้งค่า DeviseInvitable ให้ทำงานในส่วนหน้า การทำเช่นนี้ทำได้ง่ายมาก เรียกใช้คำสั่งตัวสร้างเพื่อสร้างมุมมองสำหรับ DeviseInvitable
rails generate devise_invitable:views users
คุณจะต้องเพิ่มลิงก์ในแอปพลิเคชันของคุณที่ชี้ไปยังหน้าเพื่อส่งคำเชิญ (app/views/users/invitations/new.html.erb
)
สำหรับแอปพลิเคชันนี้ คุณสามารถเพิ่มลิงก์ไปยังไฟล์การนำทางของคุณได้ นี่คือวิธีที่ฉันทำเหมือง:
#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>
หากต้องการดูเส้นทางที่ให้บริการโดย DeviseInvitable ให้เรียกใช้คำสั่ง rake routes | invit
. ผลลัพธ์จะเป็นดังนี้
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
ให้เราเห็นสิ่งที่เรามีในขณะนี้ เรียกใช้คำสั่งเพื่อเริ่มเซิร์ฟเวอร์ของคุณ rails server
.
ชี้เบราว์เซอร์ของคุณไปที่ https://localhost:3000/users/invitation/new
. ป้อนที่อยู่อีเมลในแบบฟอร์มที่แสดงและคลิกที่ปุ่ม ที่ควรจะทำงาน! หากคุณไปที่บันทึกของเซิร์ฟเวอร์ คุณจะเห็นผลลัพธ์ที่สร้างขึ้นเมื่อคุณส่งคำเชิญ ในผลลัพธ์ คุณจะเห็นลิงก์สำหรับตอบรับคำเชิญ
คุณจะเห็นด้วยกับฉันว่าจะดีกว่าถ้าคุณสามารถดูอีเมลที่ส่งในเบราว์เซอร์ของคุณ เรามาดูวิธีการทำงานกัน
การรวม Letter_Opener
Letter Opener ให้คุณดูตัวอย่างอีเมลในเบราว์เซอร์เริ่มต้นของคุณ ด้วยสิ่งนี้ คุณไม่จำเป็นต้องตั้งค่าระบบการส่งอีเมลในขณะที่ทำงานในสภาพแวดล้อมการพัฒนา
เปิด Gemfile ของคุณและเพิ่มอัญมณีด้านล่าง:
gem 'letter_opener'
เรียกใช้ bundle install
.
ใช้เท็กซ์เอดิเตอร์ ไปที่ config/environments/development.rb
และเพิ่มบรรทัดด้านล่าง
#config/environments/development.rb ... config.action_mailer.delivery_method = :letter_opener end
รีสตาร์ทเซิร์ฟเวอร์ Rails ของคุณ ตอนนี้ชี้เบราว์เซอร์ของคุณไปที่ https://localhost:3000/users/invitation/new
. กรอกและส่งแบบฟอร์มที่แสดง คราวนี้ หน้าใหม่จะปรากฏขึ้นพร้อมอีเมลเชิญ
เปลี่ยนเส้นทางการลงชื่อเข้าใช้เริ่มต้นและออกจากระบบ
โดยค่าเริ่มต้น sign_in
และ sign_out
เส้นทางเมื่อใช้ Devise จะมีลักษณะดังนี้:
sign_in:
https://localhost:3000/users/sign_in
sign_out:
https://localhost:3000/users/sign_out
หากต้องการเปลี่ยน ให้ไปที่ config/routes.rb
และเพิ่มสิ่งต่อไปนี้:
#config/routes.rb as :user do get 'signin' => 'devise/sessions#new' post 'signin' => 'devise/sessions#create' delete 'signout' => 'devise/sessions#destroy' end
คุณสามารถชี้เบราว์เซอร์ไปที่ https://localhost:3000/signin
.
บทสรุป
ตอนนี้คุณรู้วิธีใช้ DeviseInvitable แล้ว คุณยังได้เรียนรู้เกี่ยวกับอัญมณี letter_opener
. มีหลายสิ่งที่คุณสามารถทำได้ด้วย Devise ดังนั้นลองดู Wiki เพื่อเรียนรู้เพิ่มเติม ขอบคุณที่อยู่กับฉัน