रेल 7 बस कोने के आसपास है। हमारे पास एक निश्चित रिलीज की तारीख नहीं है, लेकिन यह क्रिसमस से पहले उपलब्ध होने की उम्मीद है, इसलिए जाने के लिए बहुत लंबा नहीं है। इस पोस्ट के प्रकाशन का नवीनतम संस्करण 7.0.0.rc1
है। , पहला रिलीज़ उम्मीदवार। बेसकैंप, HEY, Github, और Shopify सभी उत्पादन में Rails 7 अल्फ़ा चला रहे हैं, इसलिए हम उम्मीद कर सकते हैं कि रिलीज़ उम्मीदवार भी काफी स्थिर होगा।
इस पोस्ट में, हम कुछ नई सुविधाओं और परिवर्तनों को देखेंगे जो रेल 7 लाएगा।
नोड और वेबपैक आवश्यक नहीं
हां, आपने उसे सही पढ़ा है! रेल 7 में जावास्क्रिप्ट को अब NodeJS या वेबपैक की आवश्यकता नहीं होगी। और आप अभी भी npm संकुल का उपयोग कर सकते हैं।
ES6 को Babel के साथ ट्रांसपिल करने और Webpack के साथ बंडल करने के लिए बहुत सारे सेटअप की आवश्यकता होती है। जबकि रेल ने Webpacker
. के साथ इसका बहुत अच्छा समर्थन किया मणि, यह बहुत सारा सामान लेकर आया, इसे समझना और इसमें कोई भी बदलाव करना मुश्किल था, खासकर उन्नयन को बनाए रखते हुए।
अब, rails new
. के साथ बनाए गए नए ऐप्स के लिए डिफ़ॉल्ट importmaps-rails
. के माध्यम से आयात मानचित्रों का उपयोग करना है gem. बजाय package.json
writing लिखने के और npm
. के साथ निर्भरता स्थापित करना या yarn
, आप ./bin/importmap
. का उपयोग करते हैं निर्भरताओं को पिन (या अनपिन या अपडेट) करने के लिए सीएलआई।
उदाहरण के लिए, date-fns
स्थापित करने के लिए :
$ ./bin/importmap pin date-fns
यह config/importmap.rb
. में एक लाइन जोड़ देगा जैसे:
pin "date-fns", to: "https://ga.jspm.io/npm:[email protected]/esm/index.js"
अपने JavaScript कोड में, आप हर उस चीज़ का उपयोग करना जारी रख सकते हैं जैसे आप करते थे:
import { formatDistance, subDays } from "date-fns";
formatDistance(subDays(new Date(), 3), new Date(), { addSuffix: true });
//=> "3 days ago"
इस सेटअप के साथ एक बात का ध्यान रखें कि आप जो लिखते हैं और ब्राउज़र को जो मिलता है, उसके बीच कोई ट्रांसपिलिंग नहीं होती है। अधिकांश भाग के लिए, यह ठीक है क्योंकि सभी महत्वपूर्ण ब्राउज़र अब बॉक्स से बाहर ES6 का समर्थन करते हैं।
लेकिन इसका मतलब यह भी है कि आप टाइपस्क्रिप्ट या JSX का उपयोग नहीं कर पाएंगे क्योंकि उन्हें उपयोग करने से पहले JS में ट्रांसपिलेशन की आवश्यकता होती है।
इसलिए, यदि आप JSX के साथ रिएक्ट का उपयोग करना चाहते हैं, तो आपको अभी भी एक अलग सेटअप (वेबपैक/रोलअप/एसबिल्ड का उपयोग करके) पर वापस आना होगा।
रेल 7 आपके लिए यह कर सकता है। आपको बस अपनी चुनी हुई रणनीति के साथ एक कमांड चाहिए:
$ ./bin/rails javascript:install:[esbuild|rollup|webpack]
टर्बोलिंक और यूजेएस को टर्बो और स्टिमुलस से बदला गया
रेल 7 के साथ उत्पन्न अनुप्रयोगों को टर्बोलिंक्स और यूजेएस के बजाय डिफ़ॉल्ट रूप से टर्बो और स्टिमुलस (हॉटवायर से) मिलेंगे। Hotwire एक नया तरीका है जो वायर पर HTML भेजकर DOM को तेज़ अपडेट देता है।
डेटाबेस परत पर एन्क्रिप्शन
Rails 7 कुछ डेटाबेस फ़ील्ड को encrypts
. का उपयोग करके एन्क्रिप्टेड के रूप में चिह्नित करने की अनुमति देता है ActiveRecord::Base
पर विधि . इसका मतलब है कि एक प्रारंभिक सेटअप के बाद, आप इस तरह कोड लिख सकते हैं:
class Message < ApplicationRecord
encrypts :text
end
आप किसी अन्य विशेषता की तरह एन्क्रिप्टेड विशेषताओं का उपयोग जारी रख सकते हैं। रेल 7 डेटाबेस और आपके एप्लिकेशन के बीच इसे स्वचालित रूप से एन्क्रिप्ट और डिक्रिप्ट करेगा।
लेकिन यह एक छोटी सी विचित्रता के साथ आता है:आप उस फ़ील्ड द्वारा डेटाबेस को तब तक क्वेरी नहीं कर सकते जब तक कि आप deterministic: true
पास नहीं करते हैं। encrypts
. का विकल्प विधि। नियतात्मक मोड डिफ़ॉल्ट गैर-नियतात्मक मोड की तुलना में कम सुरक्षित है, इसलिए इसका उपयोग केवल उन विशेषताओं के लिए करें जिनकी आपको पूरी तरह से क्वेरी करने की आवश्यकता है।
एसिंक्रोनस क्वेरी करना
अब एक load_async
है वह विधि जिसका उपयोग आप पृष्ठभूमि में परिणाम लाने के लिए डेटा क्वेरी करते समय कर सकते हैं। यह विशेष रूप से महत्वपूर्ण है जब आपको नियंत्रक कार्रवाई से कई गैर-संबंधित प्रश्नों को लोड करने की आवश्यकता होती है। आप दौड़ सकते हैं:
def PostsController
def index
@posts = Post.load_async
@categories = Category.load_async
end
end
यह एक ही समय में पृष्ठभूमि में दोनों प्रश्नों को सक्रिय करेगा। इसलिए, यदि प्रत्येक क्वेरी में 200ms लगते हैं, तो डेटा प्राप्त करने में लगने वाला कुल समय 400ms के बजाय ~200ms है, यदि उन्हें क्रमानुसार प्राप्त किया जाता है।
रेल 7 के लिए Zeitwerk मोड
यह पुराने अनुप्रयोगों के लिए एक महत्वपूर्ण परिवर्तन है जो अभी भी क्लासिक लोडर चलाते हैं। सभी रेल 7 अनुप्रयोगों को Zeitwerk मोड का उपयोग करना चाहिए, लेकिन स्विच बहुत आसान है। संपूर्ण Zeitwerk अपग्रेड मार्गदर्शिका देखें।
अन्य रेल 7 अपडेट
नौकरियों के असीमित समय के लिए पुनः प्रयास करें
ActiveJob अब :unlimited
passing पास करने की अनुमति देता है attempts
. के रूप में retry_on
. पर पैरामीटर . रेल बिना किसी अधिकतम प्रयास के नौकरी का प्रयास करना जारी रखेगी।
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
#Call avatar.variant(:thumb) to get a thumb variant of an avatar:
<%= image_tag user.avatar.variant(:thumb) %>
एचटीएमएल विशेषताओं को हैश करें
एक नया tag.attributes
है उन दृश्यों में उपयोग के लिए विधि जो हैश को HTML विशेषताओं में अनुवादित करते हैं:
<input <%= tag.attributes(type: :text, aria: { label: "Search" }) %>>
उत्पादन करेगा
<input type="text" aria-label="Search" />
रूबी debug
डिबगिंग के लिए नया डिफ़ॉल्ट byebug
. से बदल गया है debug
. के लिए रत्न।
कॉल करने के बजाय byebug
, अब आपको debugger
. पर कॉल करने की आवश्यकता है डिबगिंग सत्र दर्ज करने के लिए कोड में।
sole
के साथ एकल रिकॉर्ड दर्ज करें
रिकॉर्ड की क्वेरी करते समय, अब आप sole
. पर कॉल कर सकते हैं या find_sole_by
(first
. के बजाय या find_by
) जब आप यह दावा करना चाहते हैं कि क्वेरी केवल एक रिकॉर्ड से मेल खाना चाहिए।
Product.where(["price = %?", price]).sole
# => ActiveRecord::RecordNotFound (if no Product with given price)
# => #<Product ...> (if one Product with given price)
# => ActiveRecord::SoleRecordExceeded (if more than one Product with given price)
user.api_keys.find_sole_by(key: key)
# as above
एसोसिएशन की उपस्थिति/अनुपस्थिति की जांच करें
अब हम उपयोग कर सकते हैं where.associated(:association)
यह जांचने के लिए कि क्या कोई एसोसिएशन किसी आईडी के अस्तित्व में शामिल होने और जाँच करने के बजाय रिकॉर्ड पर मौजूद है।
# Before:
account.users.joins(:contact).where.not(contact_id: nil)
# After:
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
यह उपयोगकर्ता को तत्काल (आंशिक) प्रतिक्रिया प्रदान करता है ताकि वे जान सकें कि कुछ हो रहा है और यदि आप हेरोकू पर तैनात करते हैं तो अतिरिक्त लाभ होता है।
चूंकि फ़ाइल तुरंत स्ट्रीमिंग शुरू कर देगी, हेरोकू कनेक्शन को समाप्त नहीं करेगा। इसका मतलब है कि आपको 30 सेकंड से अधिक समय लेने वाली एक बार की फाइलें उत्पन्न करने के लिए पृष्ठभूमि नौकरियों का सहारा लेने की आवश्यकता नहीं है।
रेल 7 में अपग्रेड करना
रेल के पिछले संस्करणों की तरह, उन्नयन सरल है। हालांकि हमारे पास अभी तक कोई आधिकारिक अपग्रेड गाइड नहीं है, लेकिन चरण वही रहेंगे:
- जेमफाइल में रेल संस्करण संख्या बदलें (
7.0.0.rc1
प्रकाशन तिथि के अनुसार) औरbundle update
चलाएं । - चलाएं
bundle exec rails app:update
. इंटरैक्टिव सीएलआई का पालन करें और आवश्यकतानुसार फाइलों को जोड़ें/बदलें/संशोधित करें। - अपने परीक्षण चलाएं और सत्यापित करें कि सब कुछ अपेक्षित रूप से काम करता है।
रैप अप
आप बग फिक्स, सुविधाओं और परिवर्तनों की पूरी सूची रेल 7 रिलीज नोट में देख सकते हैं। ये फिलहाल व्यापक नहीं हैं, लेकिन हम उम्मीद कर सकते हैं कि इन्हें जल्द ही अपडेट किया जाएगा।
यदि आप अभी भी रेल 6 या उससे कम चला रहे हैं, तो कृपया ध्यान दें कि रेल 7 की अंतिम रिलीज के साथ, रेल 6.1 "केवल सुरक्षा मुद्दों" मोड में प्रवेश करेगा और अब बग फिक्स प्राप्त नहीं करेगा। यह रेल 5.2 के लिए ईओएल भी चिह्नित करेगा, क्योंकि इसे अब कोई सुधार प्राप्त नहीं होगा।
कोडिंग का मज़ा लें!
पी.एस. यदि आप रूबी मैजिक की पोस्ट प्रेस से छूटते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूजलेटर की सदस्यता लें और एक भी पोस्ट मिस न करें!