परिचय
ट्यूटोरियल के पहले भाग में, हमने सीखा कि डेविस को कैसे स्थापित करें और इसे अपने रेल एप्लिकेशन में कैसे सेट करें। इस भाग में, हम देखेंगे कि कैसे DeviseInvitable को एकीकृत किया जाए।
DeviseInvitable एक एक्सटेंशन है जो Devise के साथ काम करता है। आपके आवेदन में DeviseInvitable के साथ, आपके उपयोगकर्ता अपने दोस्तों को ईमेल के माध्यम से आमंत्रित कर सकते हैं। यदि आप एक सहयोग ऐप बना रहे हैं तो यह आपके एप्लिकेशन में शामिल करने के लिए एक शानदार सुविधा है।
deviseInvitable सेट अप करना
अपना Gemfileखोलें और मणि जोड़ें:
#Gemfile ... gem 'devise_invitable'
इंस्टॉल करने के लिए कमांड चलाएँ bundle install ।
DeviseInvitable के कॉन्फ़िगरेशन विकल्प को Devise कॉन्फ़िगरेशन फ़ाइल में जोड़ने के लिए जनरेटर कमांड चलाएँ।
rails generate devise_invitable:install
आप config/initializers/devise.rb . पर जाकर नए बदलाव देख सकते हैं अपने टेक्स्ट एडिटर के साथ।
इसके बाद, हमारे User . में DeviseInvitable जोड़ें मॉडल।
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.
http://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 http://localhost:3000/, you can accept it through the link below.</p>
<p><a href="http://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 के लिए विचार उत्पन्न करने के लिए जनरेटर कमांड चलाएँ।
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 ।
अपने ब्राउज़र को http://localhost:3000/users/invitation/new पर इंगित करें . दिखाए गए फॉर्म में एक ईमेल पता दर्ज करें, और बटन पर क्लिक करें। यह काम करना चाहिए! यदि आप अपने सर्वर के लॉग में जाते हैं, तो आपको एक आउटपुट देखना चाहिए जो आपके द्वारा आमंत्रण भेजे जाने पर बनाया गया था। आउटपुट में, आपको आमंत्रण स्वीकार करने के लिए एक लिंक दिखाई देगा।
आप मेरी इस बात से सहमत होंगे कि बेहतर होगा कि आप अपने ब्राउज़र में भेजे गए ईमेल को देख सकें। आइए देखें कि यह काम कैसे करना है।
एकीकृत पत्र_ओपनर
लेटर ओपनर आपको अपने डिफ़ॉल्ट ब्राउज़र में ईमेल का पूर्वावलोकन करने की अनुमति देता है। इसके साथ, आपको विकास परिवेश में काम करते हुए मेल वितरण प्रणाली स्थापित करने की आवश्यकता नहीं है।
अपना Gemfile खोलें और नीचे दिए गए रत्न को जोड़ें:
gem 'letter_opener'
bundle install Run चलाएं ।
अपने टेक्स्ट एडिटर का उपयोग करते हुए, config/environments/development.rb पर नेविगेट करें और नीचे पंक्ति जोड़ें।
#config/environments/development.rb ... config.action_mailer.delivery_method = :letter_opener end
अपने रेल सर्वर को पुनरारंभ करें। अब अपने ब्राउज़र को http://localhost:3000/users/invitation/new पर इंगित करें . प्रदर्शित फॉर्म को भरें और जमा करें। इस बार, एक नया पेज पॉप अप होता है जिसमें आमंत्रण ईमेल होता है।
डिफ़ॉल्ट साइन इन और साइन आउट रूट बदलें
डिफ़ॉल्ट रूप से, sign_in और sign_out डेविस का उपयोग करते समय मार्ग इस तरह दिखते हैं:
sign_in: http://localhost:3000/users/sign_in
sign_out: http://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
आप अपने ब्राउज़र को http://localhost:3000/signin . पर इंगित कर सकते हैं ।
निष्कर्ष
अब आप जानते हैं कि DeviseInvitable का उपयोग कैसे करें। आपने रत्न के बारे में भी सीखा letter_opener . डेविस के साथ आप बहुत सी चीजें कर सकते हैं, इसलिए अधिक जानने के लिए विकी देखें। मेरे साथ रहने के लिए धन्यवाद।