परिचय
ट्यूटोरियल के पहले भाग में, हमने सीखा कि 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 देख कर नए परिवर्तनों को देख सकते हैं।
अब, आइए अपने User मॉडल में DeviseInvitable जोड़ें:
rails generate devise_invitable User
यह आपके मॉडल में :invitable फ्लैग जोड़ देगा, जिससे आपका User मॉडल इस तरह दिखेगा:
#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
उपरोक्त से, आप देख सकते हैं कि DeviseInvitable के लिए :email को व्हाइटलिस्ट किया गया है।
अब देखते हैं कि हमारे कंसोल में क्या है। अपने टर्मिनल पर, 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#update 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
अपना रेल्स सर्वर पुनः आरंभ करें। अब अपने ब्राउज़र को https://localhost:3000/users/invitation/new पर इंगित करें। प्रदर्शित फॉर्म को भरें और सबमिट करें। इस बार, आमंत्रण ईमेल युक्त एक नया पेज पॉप अप होगा।
डिफ़ॉल्ट साइन इन और साइन आउट रूट्स बदलें
डिफ़ॉल्ट रूप से, Devise का उपयोग करते समय sign_in और sign_out रूट्स इस तरह दिखते हैं:
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 के साथ बहुत सी चीजें की जा सकती हैं, इसलिए अधिक जानने के लिए विकी देखें। मेरे साथ बने रहने के लिए धन्यवाद।