Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

สำรวจสิ่งประดิษฐ์ ตอนที่ 2

แนะนำตัว

ในส่วนแรกของบทช่วยสอน เราได้เรียนรู้วิธีติดตั้ง 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 => "johndoe@example.com")

มันควรจะสร้างผลลัพธ์ที่ดูเหมือนว่าฉันมีด้านล่าง แม้ว่าจะมีความแตกต่างกัน

[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)> 

ได้ผลตามแผนที่วางไว้

คุณไม่ต้องการให้ผู้ใช้ของเราส่งคำเชิญผ่านบรรทัดคำสั่ง ดังนั้นเราจึงตั้งค่า 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 เพื่อเรียนรู้เพิ่มเติม ขอบคุณที่อยู่กับฉัน


No