ভূমিকা
টিউটোরিয়ালের প্রথম অংশে আমরা শিখেছিলাম কিভাবে Devise ইনস্টল করা যায় এবং রেইলস অ্যাপ্লিকেশনে সেট আপ করা যায়। এই অংশে আমরা DeviseInvitable সংহত করার পদ্ধতি দেখব।
DeviseInvitable হল Devise-এর একটি এক্সটেনশন। এটি আপনার অ্যাপ্লিকেশনে থাকলে ব্যবহারকারীরা ইমেইল মাধ্যমে বন্ধুদের আমন্ত্রণ জানাতে পারবেন। যদি আপনি একটি কলাবোরেশন অ্যাপ তৈরি করেন তবে এটি একটি দুর্দান্ত ফিচার।
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
উপরে দেখুন :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
রেইলস সার্ভার রিস্টার্ট করুন। এখন 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-এর সাথে আরও অনেক কিছু করা যায়, Wiki চেক করুন আরও শিখতে। আমার সাথে থাকার জন্য ধন্যবাদ।