Rails 7.1 जारी
(github.com/rails)config.load_defaults 7.1का उपयोग करने परActiveSupport::MessageVerifierऔरActiveSupport::MessageEncryptorकी डिफ़ॉल्ट serialization Marshal सेActiveSupport::JSONमें बदल जाती है, और पुराने Marshal message अब भी पढ़े जा सकते हैंActiveRecord::Base.serializeको डिफ़ॉल्ट रूप से YAML उपयोग न करने के लिए बदला गया है, और पुराना डिफ़ॉल्टconfig.active_record.default_column_serializer = YAMLसे बहाल किया जा सकता है- नया
7.1cache format जोड़ा गया है और यह नए apps में डिफ़ॉल्ट रूप से उपयोग होगा; मौजूदा apps में इसेconfig.load_defaults 7.1याconfig.active_support.cache_format_version = 7.1से सक्रिय किया जा सकता है6.1या7.0cache format में लिखी गई items को7.1format में पढ़ा जा सकता है- Rails 7.1 rolling deploy में पहले deploy पर cache format को यथावत रखना चाहिए, और उसके बाद वाले deploy में
7.1cache format सक्रिय करना चाहिए
:message_packऔर:message_pack_allow_marshalserialization कोMessageEncryptor,MessageVerifier,config.active_support.message_serializerमें जोड़ा गया है, और इसके लिएmsgpackgem>= 1.7.0आवश्यक हैActiveSupport::KeyGenerator,MessageEncryptor,EncryptedConfiguration, और Active Record encryption objects केinspectमें secret values exposure को रोका गया है, औरActionView::HelpersतथाERB::Utilकी XSS सुरक्षा को मजबूत किया गया हैhas_secure_passwordमेंpassword_challengevalidation और#{attribute}_saltmethod जोड़ा गया है, औरauthenticate_byको account existence के आधार पर होने वाले timing-based enumeration attacks को कम करने के लिए जोड़ा गया है- Active Record में composite primary key·composite foreign key से संबंधित support बढ़ाया गया है, और tuple syntax
where, composite key batch ordering, तथा schema में composite primary key inference का support जोड़ा गया है - PostgreSQL support में enum name rename, value add, value change migration commands, exclusion constraint, unique constraint,
INCLUDEindex option, औरNULLS [NOT] DISTINCTindex support जोड़ा गया है - SQLite3 adapter में Write-Ahead-Log normal syncing mode, capped journal size, shared memory buffer, shared cache settings के साथ औसतन 2× performance improvement बताया गया है, और double-quoted string literal को निष्क्रिय करने वाला strict strings mode डिफ़ॉल्ट रूप से सक्रिय है
- Active Record की full-table batch iteration अब डिफ़ॉल्ट रूप से range iteration का उपयोग करती है, जिससे performance बेहतर हुई है; PostgreSQL पर 1 करोड़ records के test में querying
253s→30s, updating288s→124s, deleting268s→83sके परिणाम दिए गए हैं MemCacheStoreऔरRedisCacheStoreमें connection pooling डिफ़ॉल्ट रूप से सक्रिय है; इसे बंद करने के लिए cache store settings मेंpool: falseदेना होगाTrilogydatabase client के लिए adapter जोड़ा गया है, जिससेadapter: trilogyयाtrilogy://फ़ॉर्मैट काDATABASE_URLउपयोग किया जा सकता हैActiveRecord::QueryLogsका डिफ़ॉल्ट tag format SQLCommenter format में बदल गया है, औरconfig.active_record.query_log_tags_format = :legacyसे पुराना format उपयोग किया जा सकता है- deprecation और removal items में
ActiveSupport::Deprecationsingleton usage,SafeBuffer#clone_empty,#mergeकाrewhereargument,add_foreign_keyकाdeferrable: true,TestFixtures#fixture_path, और कई deprecated Active Record settings व API cleanup शामिल हैं - Action View tests में
ActionView::TestCase.register_parserजोड़ा गया है, जिससे rendered result parsers register किए जा सकते हैं; डिफ़ॉल्ट parsers के रूप में:htmlऔर:jsonउपलब्ध हैं
1 टिप्पणियां
Hacker News की राय
Rails शानदार है, और अभी यह पहले से कहीं बेहतर हो गया है
करियर की शुरुआत में मैं मुख्य रूप से Django और Laravel इस्तेमाल करता था, फिर बाद में आजकल आम तौर पर किए जाने वाले frontend काम की ओर चला गया, और इस साल फिर से Rails + Hotwire प्रोजेक्ट संभालना पड़ा
यह कितना सरल हो गया है, देखकर सच में हैरानी हुई, और अफसोस है कि ज्यादातर लोग भूल चुके हैं कि चीजें इतनी आसान भी हो सकती हैं। यह भी डरावना है कि अभी industry में आने वाले लोग शायद ऐसी simplicity का अनुभव ही न कर पाएं
अगर आपने Rails इस्तेमाल नहीं किया है, या “PHP बदसूरत है / Rails मर चुका है / JavaScript गंदी है” जैसी बातें सुनकर उसे छोड़ दिया है, तो सलाह है कि थोड़ी देर दूसरों की बातों को नजरअंदाज करके खुले दिमाग से एक बार इसे आजमाएं
एक ही repository में 1,000 engineers के काम करने वाले माहौल के लिए यह शायद सबसे अच्छा न हो, लेकिन छोटी टीमों के लिए इसका कोई मुकाबला नहीं है और यह बाकी चीजों से बहुत आगे है। ईमानदारी से कहूं तो Laravel भी लगभग उतना ही अच्छा हो सकता है
शुरुआती development speed में मुझे लगता है Rails हमेशा जीतता है। conventions इतने सघन और अच्छी तरह design किए गए हैं कि इसके करीब आने वाली चीजें बहुत कम हैं। Laravel करीब आ रहा है, लेकिन मेरी नजर में अभी वहां नहीं पहुंचा है
हालांकि LiveView हर मायने में ज्यादा अच्छी तरह scale होता है। authentication, database access, job queues, mailers, पूरा testing toolset जैसी कई चीजें built-in हैं, direct JavaScript लगभग लिखनी नहीं पड़ती, और शानदार virtual machine BEAM भी है
कम से कम यह अच्छा है कि ये सभी projects “एक कदम पीछे हटें” वाली लड़ाई लड़ रहे हैं। काम पर हम React और Relay इस्तेमाल करते हैं, और frontend JavaScript लंबे समय से इस्तेमाल करने और खुद को कुछ हद तक ठीक-ठाक मानने के बावजूद, पार करने के लिए इतनी बाधाएं हैं कि थकान हो जाती है
नौकरी नहीं मिलती, इसलिए पर्याप्त अनुभव भी नहीं बन पाता, और आखिरकार ऐसे जादूगरों से पीछे रह जाता हूं। वे job postings 12 महीने से ज्यादा समय तक खुली भी रहती हैं
इसके बजाय, जहां demand है वहां दुनिया में और ज्यादा JavaScript फैला रहा हूं
structural रूप से मुझे ember-data वाला approach पसंद है। datasets के left join/right join जैसे कामों में बहुत कुछ automate किया जा सकता है, और integrated mock server भी है
हालांकि शायद यह इतना अच्छे से काम करता है कि बाकी चीजों जितना cool नहीं दिखता
https://emberjs.com/
13,000 लाइनों वाली Rails 7.0 app को 7.1 पर upgrade किया, और 7.0 व 7.1 के अंतर[0] को छोड़ दें तो test setup code की सिर्फ 1 line बदलकर सब कुछ चल गया
आसान upgrade path के लिहाज से इसे सफलता मानता हूं। अब मजेदार हिस्सा 7.1 के नए features इस्तेमाल करने के लिए कुछ code refactor करना है
अगर रुचि हो तो Rails / Docker example app को भी 7.1 पर upgrade कर दिया है https://github.com/nickjj/docker-rails-example
Rails 7.1 में Dockerfile शामिल जरूर है, लेकिन Docker Compose इस्तेमाल करके development और production में तुरंत काम करने वाला experience बनाना, और Postgres, Redis, Action Cable, Sidekiq आदि शामिल करना—इस तरह अभी भी जोड़ने के लिए कई विकल्प हैं
[0]: https://railsdiff.org/7.0.8/7.1.0
काफ़ी बड़े Rails 6 codebase में React बहुत ज़्यादा जुड़ा हुआ है, और उसे Hotwire इस्तेमाल करने वाले नए “non” JavaScript तरीके पर ले जाने की कोशिश कर रहा/रही हूँ। शुभकामनाएँ देना
Rails तब शानदार है जब आप defaults पर टिके रहते हैं, लेकिन जैसे ही उन defaults से बाहर जाते हैं, यह दर्द की ज़मीन बन जाता है
frontend engineer hire करने के लिए React candidates का pool कई orders of magnitude बड़ा है। आम कामों के लिए vanilla JavaScript package ढूँढकर उसे Stimulus controller में wrap करना भी React package ढूँढने से लगातार मुश्किल होता जा रहा है
Stimulus controller unit tests लिखने का कोई खास तरीका भी नहीं देता। React में हमेशा की तरह jest और react-test-renderer इस्तेमाल कर सकते हैं
ऊपर से हाल की Turbo TypeScript controversy ने Hotwire ecosystem के long-term maintenance पर भरोसा नहीं दिलाया
अभी फैसला नहीं लिया है। यह ज़रूर एक फायदा है कि Stimulus frontend code लिखने का बहुत Rails-जैसा तरीका लगता है, खासकर उन छोटी teams के लिए जो पहले से Rails से familiar हैं
अगर application काफ़ी simple है और framework के तरीके से अच्छी तरह fit बैठती है, तो framework शानदार होता है। अगर ज़्यादा complex और flexible setup चाहिए, तो libraries देखनी चाहिए
अब या तो slim से server-side rendering करता/करती हूँ, या API-only बनाकर frontend अलग कर देता/देती हूँ
Rails ने JavaScript करने के लिए CoffeeScript, asset precompilation, webpack आदि में बहुत बार दिशा बदली है
वैसे Rails 7+ में single-page app JavaScript handle करने का तरीका भी पहले से कहीं ज़्यादा reasonable है। असल में जो build tool चाहें, उसे Rails app से अलग रखकर इस्तेमाल कर सकते हैं
development के दौरान
rails sके साथyarn build --watchजैसा कुछ साथ में चलाना पड़ता है, लेकिन निजी तौर पर मुझे यह बुरा नहीं लगता और काफ़ी simpler लगता हैहमारी company Rails upgrades automate करने वाला software बनाती है, और Rails upgrade आपके लिए कर देने वाली पूरी service भी देती है। दिलचस्पी हो तो steve (at) infield.ai पर contact करें या https://app.infield.ai/users/sign_up पर free Rails upgrade plan generate कर सकते हैं। credit card की ज़रूरत नहीं
अधिक जानकारी के लिए https://docs.infield.ai/docs/creating-an-upgrade-path देखें
मेरे मामले में यह लगभग webpack replacement की तरह सीधे fit हो गया
मुझे Rails पसंद है और Rails 2 के समय से इसे बीच-बीच में इस्तेमाल करता/करती आया/आई हूँ
यह बहुत अच्छा framework है, और मेरे जैसे व्यक्ति के लिए, जिसे कभी-कभी website चालू करनी पड़ती है, यह सच में least resistance वाला path है
लेकिन नए laptop पर Rails चलाने के लिए setup करना तकलीफ़देह है। node चाहिए, तो npm भी चाहिए। backend developer होने के कारण मुझे ठीक से नहीं पता कि node कैसे setup करना है, किस order में करना है
यह काम अक्सर नहीं करता/करती, इसलिए हर बार लड़ाई जैसा लगता है। आखिरकार हो जाता है, लेकिन यह हमेशा साफ़ नहीं होता कि अंत में सब कुछ कैसे ठीक से match हो गया
काश कोई installer हो जो ज़रूरी चीज़ें एक साथ setup कर दे ताकि rails बस चल पड़े। rvm installer ruby के ऊपर rails setup कर देता है, लेकिन उसके नीचे वाला node system setup नहीं करता
https://asdf-vm.com/
Node मुख्य रूप से frontend tooling के रूप में जाना जाता है और Rails भी इसे उसी काम के लिए इस्तेमाल करता है, लेकिन मेरी याद में Node कम-से-कम शुरुआत में JavaScript runtime को backend पर लाने के लिए बनाया गया था
package manager के बिना भी Windows पर यह बस node.exe होता है, और मेरी जानकारी में npm download करके extract करना और node तथा npm को PATH environment variable में डालना ही होता है
और node install करना काफ़ी आसान है। असल में बहुत ही आसान। काश यह बहुत ज़्यादा मुश्किल होता और इसके लिए degree चाहिए होती
JavaScript भी बाकी चीज़ों की तरह एक tool ही है। पसंद हो या न हो, यह बहुत महत्वपूर्ण tool है, और पसंद हो या न हो, लंबे समय तक रहने वाला है
थोड़ा open mind रखकर कम-से-कम basics सीख लें तो काम आसान हो जाएगा
उम्मीद है Rails + HTMX और सिर्फ़ बहुत ज़्यादा interactive pages पर थोड़ा-सा JavaScript छिड़कने वाला तरीका फिर से popular होगा
Rails को Slim/HAML के साथ इस्तेमाल करना सच में मज़ेदार है। चाहें तो
ViewComponentsजैसी library से partial rendering और आसान कर सकते हैं। इसमें web components जोड़ दें तो काफ़ी interactive pages बना सकते हैं, और किसी specific page पर सच में ज़रूरत हो तो React भी इस्तेमाल कर सकते हैंHATEOAS application complexity को काफ़ी कम कर देता है। फिर भी अगर API चाहिए, तो अलग-अलग MIME types का response देना भी बहुत आसान है, और चाहें तो वही endpoint share भी कर सकते हैं
अनुभव के हिसाब से React इस्तेमाल करने वाली ज़्यादातर applications को असल में React की बिल्कुल ज़रूरत नहीं होती। कुछ popup menus की वजह से React इस्तेमाल किया जाता है
इसलिए जब React के बिना, या बहुत थोड़े React के साथ बड़े apps आने लगेंगे, तो उम्मीद है कुछ लोगों को एहसास होगा कि आज हमारी applications कितनी unnecessary complex हैं
लेकिन मैं पहले से ही “सब React इस्तेमाल करते हैं, इसलिए हमें React पर बदलना चाहिए” वाली बातें देख रहा/रही हूँ। आह निकलती है
सपना तो देखा जा सकता है
आधिकारिक घोषणा यहाँ है: https://rubyonrails.org/2023/10/5/Rails-7-1-0-has-been-released
इसमें high-level details थोड़ी और हैं, और नए बदलावों में से कुछ को आज़माने को लेकर उत्साहित हूँ। खास तौर पर नया async query methods तेज़ performance सुधार के लिए काफ़ी उपयोगी लगता है
backend में Rails को जितनी सराहना मिलनी चाहिए, उतनी नहीं मिलती
लेकिन frontend वाला हिस्सा बहुत लंबे समय तक बिखरा हुआ था
अब Rails 7.1 + Hotwired + Importmaps के साथ काम करना मज़ेदार है
मगर browsers में कम-से-कम ES6 और Import Maps का support अच्छा होने तक इंतज़ार करना पड़ा
इस लेख की तारीख देखें तो https://web.dev/import-maps-in-all-modern-browsers/ में 28 मार्च 2023 को घोषणा हुई कि सभी modern browsers में importmaps इस्तेमाल किए जा सकते हैं
इसलिए अब तक Webpack, Yarn और बाकी JavaScript सहायक tools से बचने का कोई तरीका नहीं था
अब importmaps हैं और browser का ES6 support भी काफ़ी अच्छा है, इसलिए https://caniuse.com/?search=es6, लगभग बिना extra tools के modern JavaScript इस्तेमाल की जा सकती है
कुछ हफ्ते पहले एक दोस्त ने मज़ाक में कहा, “अगर Rails release announce हो गया और तुमने upgrade PR नहीं डाला, तो क्या वह सच में हुआ भी?”
चलो, अब PR डालने का समय है। भले ही उसे कई महीनों से pending 7.0 PR के पीछे stack करना पड़े
अनुभव से, कई teams को ActiveRecord के साथ साफ़ codebase बनाने में मुश्किल होती है
कृपया मारना मत, लेकिन मैं अभी भी Rails 4.2 इस्तेमाल कर रहा हूँ और संतुष्ट हूँ
बिना JavaScript या कम JavaScript वाले backend SaaS काम के लिए, जो मैं खुद करता हूँ या B2B companies के लिए करता हूँ, इसमें सब कुछ मिल जाता है, और यह low-spec VPS पर भी चलता है
अगर जवाब देने का समय हो, तो जानना चाहूँगा कि upgrade क्यों करना चाहिए
पुराने version की मुख्य समस्या उससे जुड़े gems की vulnerabilities हैं। उदाहरण के लिए nokogiri को Rails major upgrade के बिना upgrade नहीं किया जा सकता हो सकता है
हालांकि ज़्यादातर apps, मान लें complex XML parsing नहीं करते, इसलिए काफी vulnerabilities लागू नहीं होतीं। इसलिए यह पक्का करने के लिए थोड़ा maintenance चाहिए कि यह सुरक्षित है। bugs रोकने के लिए monkey patches डालना भी अक्सर होता है
upgrade करने से security बेहतर होती है और maintenance time घटता है। लेकिन लगातार upgrades की लागत भी ध्यान में रखनी चाहिए। एक और factor यह है कि नए versions में तेज़ Ruby का support मिल सकता है
आम तौर पर Rails app बनाते समय latest release इस्तेमाल करता हूँ, लेकिन जब तक app लोकप्रिय न हो या इतना पुराना न हो कि नए systems पर कुछ काम न करे, बाद के Rails versions पर upgrade नहीं करता