{"id":97177,"date":"2025-02-12T18:32:48","date_gmt":"2025-02-12T15:02:48","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af\/"},"modified":"2025-02-12T18:32:48","modified_gmt":"2025-02-12T15:02:48","slug":"%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af\/","title":{"rendered":"\u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644 \u0628\u0627 \u06a9\u062f\u0647\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0634\u062f\u0647 \u062f\u0631 Ruby on Rails \u0628\u062f\u0648\u0646 \u0637\u0631\u0627\u062d\u06cc"},"content":{"rendered":"<div data-article-id=\"2273474\" id=\"article-body\">\n<p>\u0633\u0644\u0627\u0645 \u060c \u0645\u0627 \u0645\u06cc \u062f\u0627\u0646\u06cc\u0645 \u06a9\u0647 \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644 \u062f\u0631 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0632\u0646\u062f\u06af\u06cc \u0631\u0648\u0632\u0645\u0631\u0647 \u0645\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0622\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u0634\u0647\u0631\u062a \u0641\u0631\u0633\u062a\u0646\u062f\u0647 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0645\u06cc \u0628\u062e\u0634\u06cc\u0645 \u0648 \u0627\u0632 \u0647\u0645\u0647 \u0645\u0647\u0645\u062a\u0631 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062c\u0639\u0644 \u0647\u0648\u06cc\u062a. \u0628\u0627 \u062a\u0648\u062c\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u060c \u0645\u0646 \u062f\u0631 \u062c\u0627\u0645\u0639\u0647 \u0631\u06cc\u0644\u0632 \u062f\u06cc\u062f\u0645 \u06a9\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Devise \u06a9\u0627\u0645\u0644\u0627\u064b \u0645\u062a\u062f\u0627\u0648\u0644 \u0627\u0633\u062a \u060c \u0627\u0645\u0627 \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0633\u062a\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0631\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u060c \u0686\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u061f \u0686\u06af\u0648\u0646\u0647 \u0622\u0646 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u06cc\u062f\u061f \u0627\u0645\u0631\u0648\u0632 \u060c \u0645\u0646 \u0642\u0635\u062f \u062f\u0627\u0631\u0645 \u0628\u0647 \u0634\u0645\u0627 \u0622\u0645\u0648\u0632\u0634 \u062f\u0647\u0645.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u060c \u0645\u0646 \u0627\u0632 Rails 7.2 \u060c SQLITE3 \u0648 BCRYPT \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u0645 \u06a9\u0631\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af\/#1_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%A7%D9%88%D9%84%DB%8C%D9%87\" >1. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0648\u0644\u06cc\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af\/#2_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_Mailer\" >2. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Mailer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af\/#3_%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86_%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1\" >3. \u0627\u062c\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u06a9\u0646\u062a\u0631\u0644\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af\/#4_%D9%86%D9%85%D8%A7%DB%8C_%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >4. \u0646\u0645\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af\/#5_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D9%85%D8%B3%DB%8C%D8%B1%D9%87%D8%A7\" >5. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/%d8%aa%d8%a3%db%8c%db%8c%d8%af-%d8%a7%db%8c%d9%85%db%8c%d9%84-%d8%a8%d8%a7-%da%a9%d8%af%d9%87%d8%a7%db%8c-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%b4%d8%af%d9%87-%d8%af%d8%b1-ruby-on-rails-%d8%a8%d8%af\/#%D9%BE%D8%A7%DB%8C%D8%A7%D9%86\" >\u067e\u0627\u06cc\u0627\u0646<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"1_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D8%A7%D9%88%D9%84%DB%8C%D9%87\"><\/span>\n<p>  1. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0648\u0644\u06cc\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u06cc\u0644 \u060c \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>rails new verification-app\ncd verification-app\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>1.1 \u06cc\u06a9 \u0645\u062f\u0644 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/strong><br \/>\u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062e\u0648\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>rails generate model User name:string email:string password_digest:string verification_code:string verified:boolean\nrails db:migrate\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u063a\u06cc\u06cc\u0631 <code>app\/models\/user.rb<\/code> \u0634\u0627\u0645\u0644 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u0646:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>class User &lt; ApplicationRecord\n  has_secure_password\n  before_create :generate_verification_code\n  validates :name, :email, presence: true\n  validates :email, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }\n\n  def generate_verification_code\n    self.verification_code = rand(100000..999999).to_s\n    self.verified = false\n  end\nend\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0648\u0634 <code>generate_verification_code<\/code>: \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0634\u0648\u062f \u060c \u06cc\u06a9 \u06a9\u062f \u062a\u0623\u06cc\u06cc\u062f \u062a\u0635\u0627\u062f\u0641\u06cc (\u06cc\u06a9 \u0634\u0645\u0627\u0631\u0647 6 \u0631\u0642\u0645\u06cc) \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u06a9\u062f \u062f\u0631 <code>verification_code<\/code> \u0648\u06cc\u0698\u06af\u06cc \u060c \u0648 <code>verified<\/code> \u0648\u06cc\u0698\u06af\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a <code>false<\/code>\u060c \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0647\u0646\u0648\u0632 \u062a\u0623\u06cc\u06cc\u062f \u0646\u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"2_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_Mailer\"><\/span>\n<p>  2. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Mailer<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Mailer \u0645\u0627\u0698\u0648\u0644 Rails \u0627\u0633\u062a \u06a9\u0647 \u0645\u0633\u0626\u0648\u0644 \u062a\u0633\u0647\u06cc\u0644 \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0627\u0644\u06af\u0648\u0647\u0627 \u060c \u0686\u06cc\u062f\u0645\u0627\u0646 \u0647\u0627 \u0648 \u0628\u0631\u062e\u06cc \u0645\u0646\u0637\u0642 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0645\u06cc\u0644 \u0628\u0647 \u0631\u0648\u0634 \u0633\u0627\u0632\u0645\u0627\u0646 \u06cc\u0627\u0641\u062a\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f.<\/p>\n<p><strong>2.1 \u0627\u06cc\u062c\u0627\u062f \u067e\u0633\u062a \u0627\u0644\u06a9\u062a\u0631\u0648\u0646\u06cc\u06a9\u06cc<\/strong><br \/>\u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062e\u0648\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>rails generate mailer UserMailer\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u063a\u06cc\u06cc\u0631 <code>app\/mailers\/user_mailer.rb<\/code> :<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>class UserMailer &lt; ApplicationMailer\n  default from: 'youremail@gmail.com'\n\n  def verification_email(user)\n    @user = user\n    mail(to: @user.email, subject: \"Verification Code\")\n  end\nend\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 &#39;youremail@gmail.com&#39; \u060c \u0627\u0632 \u0627\u06cc\u0645\u06cc\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u0633\u0626\u0648\u0644\u06cc\u062a \u0627\u0631\u0633\u0627\u0644 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u0628\u0631 \u0639\u0647\u062f\u0647 \u062f\u0627\u0631\u062f. \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u0645 \u0627\u0632 \u0622\u0646 \u062f\u0631 \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0627\u0639\u062a\u0628\u0627\u0631 \u06cc\u0627 \u0645\u062d\u06cc\u0637 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u060c \u0627\u0645\u0627 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u060c \u0622\u0646 \u0631\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0635\u0631\u06cc\u062d \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u0627\u06cc <code>app\/views\/user_mailer\/verification_email.html.erb<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\n\n\n  \n\n\n  <div class=\"max-w-lg mx-auto my-10 bg-white p-8 rounded-lg shadow-lg\">\n    \n    <p class=\"text-lg mb-4\">Hi, &lt;%= @user.name %&gt;!<\/p>\n    <p class=\"text-lg mb-4\">Your verification code is: <strong class=\"text-blue-500\">&lt;%= @user.verification_code %&gt;<\/strong><\/p>\n    <p class=\"text-lg\">Enter this code on the verification page to activate your account.<\/p>\n  <\/div>\n\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062f\u06cc\u062f\u06af\u0627\u0647 \u0637\u0631\u062d \u0646\u0627\u0645\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0645\u062b\u0627\u0644 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0627 Tailwind \u0633\u0628\u06a9 \u06a9\u0646\u06cc\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0622\u0646 \u062f\u0631 \u06cc\u06a9 \u0633\u0627\u062e\u062a\u0627\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc ERB \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p><strong>2.2 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc SMTP (Gmail &#8211; \u062a\u0633\u062a)<\/strong><br \/>\u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0646 \u060c \u0645\u0646 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0632 Gmail \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 \u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062e\u062f\u0645\u0627\u062a \u062f\u06cc\u06af\u0631\u06cc \u0645\u0627\u0646\u0646\u062f SendGrid (\u062a\u0648\u0635\u06cc\u0647 \u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f) \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0641\u0642\u0637 \u0645\u0637\u0627\u0628\u0642 \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0645\u0648\u0631\u062f Gmail \u060c \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u062f\u0631 \u0644\u06cc\u0646\u06a9 \u0632\u06cc\u0631 \u062b\u0628\u062a \u06a9\u0646\u06cc\u062f \u0648 \u062f\u0631 \u0635\u0648\u0631\u062a \u062a\u0645\u0627\u06cc\u0644 \u0627\u0632 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062e\u0648\u062f \u062f\u0631 \u0627\u0639\u062a\u0628\u0627\u0631 \u0631\u06cc\u0644 \u06cc\u0627 ENV \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<ol>\n<li>\u062f\u0633\u062a\u0631\u0633\u06cc: https:\/\/myaccount.google.com\/apppasswords\n<\/li>\n<li>\u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0645\u0632\u0639\u0628\u0648\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0647 \u062c\u0627\u06cc \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0648\u0627\u0642\u0639\u06cc \u062e\u0648\u062f \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u062f\u0631 &#8220;user_name&#8221; \u060c \u0627\u06cc\u0646 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/li>\n<li>\u062f\u0631 &#8220;\u06af\u0630\u0631\u0648\u0627\u0698\u0647&#8221; \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062d\u0627\u0635\u0644 \u0627\u0632 \u062b\u0628\u062a \u0646\u0627\u0645 \u0628\u0631\u0646\u0627\u0645\u0647 Gmail \u0631\u0627 \u0648\u0627\u0631\u062f \u0645\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ol>\n<p>\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 <code>config\/environments\/development.rb<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>config.action_mailer.delivery_method = :smtp\nconfig.action_mailer.smtp_settings = {\n  address: \"smtp.gmail.com\",\n  port: 587,\n  domain: \"gmail.com\",\n  authentication: \"plain\",\n  enable_starttls_auto: true,\n  user_name: Rails.application.credentials.gmail_username,\n  password: Rails.application.credentials.gmail_password\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"3_%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86_%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1\"><\/span>\n<p>  3. \u0627\u062c\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u06a9\u0646\u062a\u0631\u0644\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u06a9\u0646\u062a\u0631\u0644\u0631 \u0645\u0627 \u060c \u0627\u06cc\u0646\u062c\u0627\u0633\u062a \u06a9\u0647 \u0631\u0648\u0634\u0647\u0627\u06cc \u0645\u0633\u0626\u0648\u0644 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0645\u0646\u0637\u0642 \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u062f\u0631 \u0622\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0646\u062f.<br \/>\u062a\u063a\u06cc\u06cc\u0631 <code>app\/controllers\/users_controller.rb<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>class UsersController &lt; ApplicationController\n  def new\n    @user = User.new\n  end\n\n  def create\n    @user = User.new(user_params)\n    if @user.save\n      UserMailer.verification_email(@user).deliver_now\n      redirect_to verify_user_path(@user), notice: \"Code sent to your email.\"\n    else\n      render :new, status: :unprocessable_entity, notice: \"Try again\"\n    end\n  end\n\n  def verify\n    @user = User.find(params[:id])\n  end\n\n  def confirm_verification\n    @user = User.find(params[:id])\n    if @user.verification_code == params[:verification_code]\n      @user.update(verified: true, verification_code: nil)\n      redirect_to new_session_path, notice: \"Account verified! Log in.\"\n    else\n      flash.now[:alert] = \"Code invalid!\"\n      render :verify, status: :unprocessable_entity\n    end\n  end\n\n  def resend_verification_code\n    @user = User.find(params[:id])\n    @user.update(verification_code: rand(100000..999999).to_s)\n    UserMailer.verification_email(@user).deliver_now\n\n    redirect_to verify_user_path(@user), notice: \"New code sent to your email.\"\n  end\n\n  def show\n    @user = User.find(params[:id])\n  end\n\n  private\n\n  def user_params\n    params.require(:user).permit(:name, :email, :password, :password_confirmation)\n  end\nend\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"4_%D9%86%D9%85%D8%A7%DB%8C_%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  4. \u0646\u0645\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0646\u0645\u0627\u06cc \u0627\u0635\u0644\u06cc \u0645\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u06a9\u062f\u06cc \u0631\u0627 \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0645\u06cc\u0644 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u0645.<br \/>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0646 <code>app\/views\/users\/verify.html.erb<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code><div class=\"max-w-md mx-auto mt-10 p-6 bg-white shadow-lg rounded-lg\">\n  \n\n  <p class=\"mb-4\">A verification code has been sent to your email.<\/p>\n\n  &lt;%= form_with url: confirm_verification_user_path(@user), local: true, class: \"space-y-4\" do |form| %&gt;\n    <p>\n      &lt;%= form.label :verification_code, \"Enter the Code\", class: \"block text-sm font-medium text-gray-700\" %&gt;\n      &lt;%= form.text_field :verification_code, class: \"mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm\" %&gt;\n    <\/p>\n\n    <p>\n      &lt;%= form.submit \"Verify Account\", class: \"w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500\" %&gt;\n    <\/p>\n  &lt;% end %&gt;\n  <p id=\"resend-info\">You can resend the code at <span id=\"timer\">30<\/span> seconds.<\/p>\n  &lt;%= button_to \"Resend Code\", resend_verification_code_user_path(@user), method: :post, id: \"resend-button\", disabled: true %&gt;\n<\/div>\n\n<script><![CDATA[\n  document.addEventListener(\"DOMContentLoaded\", function() {\n    let timer = 30;\n    let button = document.getElementById(\"resend-button\");\n    let timerText = document.getElementById(\"timer\");\n\n    let countdown = setInterval(function() {\n      timer--;\n      timerText.textContent = timer;\n\n      if (timer <= 0) {\n        clearInterval(countdown);\n        button.disabled = false;\n        document.getElementById(\"resend-info\").textContent = \"Didn't receive the code? Resend now.\";\n      }\n    }, 1000);\n  });\n]]><\/script>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"5_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D9%85%D8%B3%DB%8C%D8%B1%D9%87%D8%A7\"><\/span>\n<p>  5. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0633\u0631\u0627\u0646\u062c\u0627\u0645 \u060c \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0645\u0627.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>resources :users, only: [:new, :create, :show] do\n  member do\n    get :verify\n    post :confirm_verification\n    post :resend_verification_code\n  end\nend\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%A7%DB%8C%D8%A7%D9%86\"><\/span>\n<p>  \u067e\u0627\u06cc\u0627\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0648 \u0627\u06cc\u0646 \u0647\u0645\u0627\u0646 \u0627\u0633\u062a \u060c \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644 \u0648\u0627\u0642\u0639\u06cc \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u062f. \u0627\u06af\u0631 \u0627\u06cc\u0646 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u062d\u0644\u06cc \u0628\u0627\u0634\u062f \u060c Gmail \u062e\u0648\u0628 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u060c SendGrid \u06cc\u0627 MailGun \u0628\u06cc\u0634\u062a\u0631 \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0631\u06cc\u0644 \u0647\u0627 \u0642\u0627\u062f\u0631 \u0628\u0647 \u0627\u0646\u062c\u0627\u0645 \u06a9\u0627\u0631\u0647\u0627\u06cc \u0628\u06cc \u0634\u0645\u0627\u0631\u06cc \u0628\u0627 \u0627\u0645\u06a9\u0627\u0646\u0627\u062a \u0628\u06cc \u0634\u0645\u0627\u0631\u06cc \u0647\u0633\u062a\u0646\u062f \u0648 \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u06a9\u06cc \u0627\u0632 \u0622\u0646\u0647\u0627 \u0628\u0627 \u0633\u0647\u0648\u0644\u062a \u0646\u0633\u0628\u06cc \u0627\u0633\u062a. \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u0647 \u06a9\u0633\u0627\u0646\u06cc \u06a9\u0647 \u0628\u0647 \u0622\u0646 \u0627\u062d\u062a\u06cc\u0627\u062c \u062f\u0627\u0631\u0646\u062f \u06a9\u0645\u06a9 \u06a9\u0646\u062f \u060c \u0648 \u0627\u06af\u0631 \u0686\u06cc\u0632\u06cc \u0627\u0634\u062a\u0628\u0627\u0647 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u06cc\u062f \u06cc\u0627 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u062f\u0627\u0631\u06cc\u062f \u060c \u0627\u062d\u0633\u0627\u0633 \u0631\u0627\u062d\u062a\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631\u0627\u062a \u0628\u06af\u0630\u0627\u0631\u06cc\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646 \u0628\u062d\u062b \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0645\u062e\u0632\u0646 \u062f\u0631 GitHub \u0645\u0646: Rails-Evification-Email<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0633\u0644\u0627\u0645 \u060c \u0645\u0627 \u0645\u06cc \u062f\u0627\u0646\u06cc\u0645 \u06a9\u0647 \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644 \u062f\u0631 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0632\u0646\u062f\u06af\u06cc \u0631\u0648\u0632\u0645\u0631\u0647 \u0645\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0622\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u0634\u0647\u0631\u062a \u0641\u0631\u0633\u062a\u0646\u062f\u0647 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0645\u06cc \u0628\u062e\u0634\u06cc\u0645 \u0648 \u0627\u0632 \u0647\u0645\u0647 \u0645\u0647\u0645\u062a\u0631 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062c\u0639\u0644 \u0647\u0648\u06cc\u062a. \u0628\u0627 \u062a\u0648\u062c\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u060c \u0645\u0646 \u062f\u0631 \u062c\u0627\u0645\u0639\u0647 \u0631\u06cc\u0644\u0632 \u062f\u06cc\u062f\u0645 \u06a9\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Devise \u06a9\u0627\u0645\u0644\u0627\u064b \u0645\u062a\u062f\u0627\u0648\u0644 \u0627\u0633\u062a &hellip;<\/p>\n","protected":false},"author":2,"featured_media":97178,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/media2.dev.to\/dynamic\/image\/width=1000,height=500,fit=cover,gravity=auto,format=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3vdzr5h54slxmldn6dgd.png","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-97177","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/97177","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=97177"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/97177\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/97178"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=97177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=97177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=97177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}