Rails 7 बस आने ही वाला है। हमारे पास एक कन्फर्म रिलीज़ डेट नहीं है, लेकिन उम्मीद है कि यह क्रिसमस से पहले उपलब्ध होगा, इसलिए ज्यादा समय नहीं बचा है। इस पोस्ट के प्रकाशन के समय नवीनतम संस्करण 7.0.0.rc1 है, पहला रिलीज़ कैंडिडेट। Basecamp, HEY, Github, और Shopify सभी Rails 7 अल्फा को प्रोडक्शन में चला रहे हैं, इसलिए हम रिलीज़ कैंडिडेट के भी काफी स्थिर होने की उम्मीद कर सकते हैं।
इस पोस्ट में, हम उन कुछ नए फीचर्स और परिवर्तनों को देखेंगे जो Rails 7 लाएगा।
Node और Webpack की आवश्यकता नहीं
हां, आपने सही पढ़ा! Rails 7 में JavaScript को अब NodeJS या Webpack की आवश्यकता नहीं होगी। और आप अभी भी npm पैकेजेस का उपयोग कर सकते हैं।
Babel के साथ ES6 को ट्रांसपाइल करना और Webpack के साथ बंडलिंग के लिए बहुत सारे सेटअप की आवश्यकता होती है। जबकि Rails ने Webpacker जेम के साथ इसका काफी अच्छा समर्थन किया, लेकिन यह बहुत सारा बोझ लाया, समझना और इसमें बदलाव करना कठिन था, खासकर अपग्रेडेबिलिटी बनाए रखते हुए।
अब, rails new के साथ बनाए गए नए ऐप्स के लिए डिफ़ॉल्ट importmaps-rails जेम के माध्यम से इम्पोर्ट मैप्स का उपयोग करना है। package.json लिखने और npm या yarn के साथ निर्भरताएं इंस्टॉल करने के बजाय, आप निर्भरताओं को पिन (या अनपिन या अपडेट) करने के लिए ./bin/importmap CLI का उपयोग करते हैं।
उदाहरण के लिए, date-fns इंस्टॉल करने के लिए:
$ ./bin/importmap pin date-fnsयह config/importmap.rb में एक लाइन जोड़ देगा जैसे:
pin "date-fns", to: "https://ga.jspm.io/npm:date-fns@2.27.0/esm/index.js"अपने JavaScript कोड में, आप पहले की तरह सब कुछ उपयोग करना जारी रख सकते हैं:
import { formatDistance, subDays } from "date-fns"; formatDistance(subDays(new Date(), 3), new Date(), { addSuffix: true }); //=> "3 days ago"इस सेटअप के साथ ध्यान रखने वाली एक बात यह है कि आप जो लिखते हैं और ब्राउज़र को क्या मिलता है, उसके बीच कोई ट्रांसपाइलिंग नहीं होती। अधिकांश भाग के लिए, यह ठीक है क्योंकि अब जो ब्राउज़र मायने रखते हैं वे ES6 को आउट-ऑफ-द-बॉक्स सपोर्ट करते हैं।
लेकिन इसका मतलब यह भी है कि आप TypeScript या JSX का उपयोग नहीं कर पाएंगे क्योंकि उन्हें उपयोग से पहले JS में ट्रांसपाइलेशन की आवश्यकता होती है।
तो, यदि आप React के साथ JSX का उपयोग करना चाहते हैं, तो आपको अभी भी एक अलग सेटअप (webpack/rollup/esbuild का उपयोग करके) पर वापस जाना होगा।
Rails 7 यह आपके लिए कर सकता है। आपको बस अपनी चुनी हुई रणनीति के साथ एक कमांड की आवश्यकता है:
$ ./bin/rails javascript:install:[esbuild|rollup|webpack]Turbolinks और UJS को Turbo और Stimulus द्वारा रिप्लेस किया गया
Rails 7 के साथ जेनरेट किए गए एप्लिकेशन को डिफ़ॉल्ट रूप से Turbolinks और UJS के बजाय Hotwire से Turbo और Stimulus मिलेगा। Hotwire एक नया दृष्टिकोण है जो HTML को वायर पर भेजकर DOM में तेज़ अपडेट देता है।
डेटाबेस लेयर पर एन्क्रिप्शन
Rails 7 ActiveRecord::Base पर encrypts मेथड का उपयोग करके कुछ डेटाबेस फील्ड्स को एन्क्रिप्टेड के रूप में चिह्नित करने की अनुमति देता है। इसका मतलब है कि एक प्रारंभिक सेटअप के बाद, आप इस तरह कोड लिख सकते हैं:
class Message < ApplicationRecord encrypts :text endआप एन्क्रिप्टेड अट्रिब्यूट्स का उपयोग वैसे ही जारी रख सकते हैं जैसे आप किसी अन्य अट्रिब्यूट का करते हैं। Rails 7 डेटाबेस और आपके एप्लिकेशन के बीच इसे स्वचालित रूप से एन्क्रिप्ट और डिक्रिप्ट करेगा।
लेकिन इसमें एक मामूली विचित्रता है: आप उस फील्ड द्वारा डेटाबेस को क्वेरी नहीं कर सकते जब तक कि आप encrypts मेथड में deterministic: true विकल्प पास नहीं करते। डिटरमिनिस्टिक मोड डिफ़ॉल्ट नॉन-डिटरमिनिस्टिक मोड की तुलना में कम सुरक्षित है, इसलिए इसका उपयोग केवल उन अट्रिब्यूट्स के लिए करें जिन्हें आप बिल्कुल क्वेरी करना चाहते हैं।
एसिंक्रोनस क्वेरीइंग
अब एक load_async मेथड है जिसका उपयोग आप डेटा क्वेरी करते समय बैकग्राउंड में परिणाम लाने के लिए कर सकते हैं। यह विशेष रूप से महत्वपूर्ण है जब आपको एक कंट्रोलर एक्शन से कई असंबंधित क्वेरीज़ लोड करने की आवश्यकता होती है। आप चला सकते हैं:
def PostsController def index @posts = Post.load_async @categories = Category.load_async end endयह दोनों क्वेरीज़ को एक ही समय में बैकग्राउंड में फायर करेगा। इसलिए, यदि प्रत्येक क्वेरी में 200ms लगते हैं, तो डेटा लाने में कुल समय ~200ms खर्च होगा बजाय 400ms के, यदि उन्हें सीरियल रूप से लाया जाता है।
Rails 7 के लिए Zeitwerk मोड
यह पुराने एप्लिकेशन्स के लिए एक ब्रेकिंग चेंज है जो अभी भी क्लासिक लोडर चलाते हैं। सभी Rails 7 एप्लिकेशन्स को Zeitwerk मोड का उपयोग करना होगा, लेकिन स्विच काफी आसान है। पूरा Zeitwerk अपग्रेड गाइड देखें।
अन्य Rails 7 अपडेट्स
जॉब्स को अनलिमिटेड टाइम्स रीट्राई करें
ActiveJob अब retry_on पर attempts पैरामीटर के रूप में :unlimited पास करने की अनुमति देता है। Rails किसी भी अधिकतम प्रयासों की संख्या के बिना जॉब को प्रयास करना जारी रखेगा।
class MyJob < ActiveJob::Base retry_on(AlwaysRetryException, attempts: :unlimited) def perform raise "KABOOM" end endनेम्ड वेरिएंट्स
अब आप ActiveStorage पर वेरिएंट्स को नाम दे सकते हैं बजाय हर एक्सेस पर आकार निर्दिष्ट करने के।
class User < ApplicationRecord has_one_attached :avatar do |attachable| attachable.variant :thumb, resize: "100x100" end end # avatar.variant(:thumb) कॉल करें ताकि अवतार का थंब वेरिएंट मिल सके: <%= image_tag user.avatar.variant(:thumb) %>हैश को HTML अट्रिब्यूट्स में बदलें
व्यूज़ में उपयोग के लिए एक नया tag.attributes मेथड है जो हैश को HTML अट्रिब्यूट्स में अनुवाद करता है:
>उत्पन्न करेगा
Ruby debug
डीबगिंग के लिए नया डिफ़ॉल्ट byebug से debug जेम में बदल गया है।
byebug कॉल करने के बजाय, अब आपको कोड में डीबगिंग सेशन में प्रवेश करने के लिए debugger कॉल करने की आवश्यकता है।
sole के साथ सिंगल रिकॉर्ड असर्ट करें
रिकॉर्ड्स क्वेरी करते समय, अब आप sole या find_sole_by कॉल कर सकते हैं ( first या find_by के बजाय) जब आप यह असर्ट करना चाहते हैं कि क्वेरी को केवल एक रिकॉर्ड से मेल खाना चाहिए।
Product.where(["price = %?", price]).sole # => ActiveRecord::RecordNotFound (यदि दिए गए मूल्य वाला कोई Product नहीं) # => # (यदि दिए गए मूल्य वाला एक Product) # => ActiveRecord::SoleRecordExceeded (यदि दिए गए मूल्य वाले एक से अधिक Product) user.api_keys.find_sole_by(key: key) # उपरोक्त के अनुसार एसोसिएशन की उपस्थिति/अनुपस्थिति जांचें
अब हम जांचने के लिए where.associated(:association) का उपयोग कर सकते हैं कि क्या किसी रिकॉर्ड पर एसोसिएशन मौजूद है, बजाय जॉइन करने और आईडी के अस्तित्व की जांच करने के।
# पहले: account.users.joins(:contact).where.not(contact_id: nil) # बाद: account.users.where.associated(:contact)कंट्रोलर एक्शन्स से जेनरेटेड फाइल्स स्ट्रीम करें
अब आप कंट्रोलर एक्शन के अंदर send_stream का उपयोग करके ऑन-द-फ्लाई जेनरेट की जा रही फाइल को स्ट्रीम करना शुरू कर सकते हैं।
send_stream(filename: "subscribers.csv") do |stream| stream.write "email_address,updated_at\n" @subscribers.find_each do |subscriber| stream.write "#{subscriber.email_address},#{subscriber.updated_at}\n" end endयह उपयोगकर्ता को तत्काल (आंशिक) रिस्पॉन्स प्रदान करता है ताकि उन्हें पता चले कि कुछ हो रहा है और यदि आप Heroku पर डेप्लॉय करते हैं तो इसका एक अतिरिक्त लाभ है।
चूंकि फाइल तुरंत स्ट्रीम होना शुरू हो जाएगी, Heroku कनेक्शन को समाप्त नहीं करेगा। इसका मतलब है कि आपको उन वन-ऑफ फाइल्स को जेनरेट करने के लिए बैकग्राउंड जॉब्स का सहारा लेने की आवश्यकता नहीं है जिनमें 30 सेकंड से अधिक समय लगता है।
Rails 7 में अपग्रेड करना
Rails के पिछले संस्करणों की तरह, अपग्रेड करना सरल है। जबकि हमारे पास अभी तक आधिकारिक अपग्रेड गाइड नहीं है, चरण वही रहेंगे:
- Gemfile में Rails संस्करण संख्या बदलें (
7.0.0.rc1प्रकाशन तिथि तक) औरbundle updateचलाएं। bundle exec rails app:updateचलाएं। इंटरएक्टिव CLI का पालन करें और आवश्यकतानुसार फाइलें जोड़ें/बदलें/संशोधित करें।- अपने टेस्ट्स चलाएं और सत्यापित करें कि सब कुछ अपेक्षा के अनुरूप काम करता है।
समापन
आप Rails 7 रिलीज़ नोट्स में बग फिक्स, फीचर्स, और परिवर्तनों की पूरी सूची देख सकते हैं। ये फिलहाल व्यापक नहीं हैं, लेकिन हम जल्द ही उनके अपडेट होने की उम्मीद कर सकते हैं।
यदि आप अभी भी Rails 6 या उससे कम चला रहे हैं, तो कृपया ध्यान दें कि Rails 7 के फाइनल रिलीज़ के साथ, Rails 6.1 "सुरक्षा मुद्दे केवल" मोड में प्रवेश करेगा और अब बग फिक्स प्राप्त नहीं करेगा। यह Rails 5.2 के EOL को भी चिह्नित करेगा, क्योंकि इसे अब कोई फिक्स प्राप्त नहीं होगा।
हैप्पी कोडिंग!
P.S. यदि आप Ruby Magic पोस्ट्स को प्रेस से निकलते ही पढ़ना चाहते हैं, तो हमारे Ruby Magic न्यूज़लेटर को सब्सक्राइब करें और कभी भी एक भी पोस्ट मिस न करें!