রেইলস ৭ কেবল কয়েক দিনের দূরত্বে। আমাদের একটি কনফার্মড রিলিজ ডেট নেই, কিন্তু আশা করা হচ্ছে ক্রিসমাসের আগে এটি উপলব্ধ হবে, তাই আর অনেক দের নেই। এই পোস্ট পাবলিকেশনের সময় লেটেস্ট ভার্সন হল 7.0.0.rc1, প্রথম রিলিজ ক্যান্ডিডেট। Basecamp, HEY, Github, এবং Shopify সব রেইলস ৭ আলফা প্রোডাকশনে রান করছে, তাই আমরা রিলিজ ক্যান্ডিডেটও প্রিয় ভাবেই স্টেবল (stable) আশা করতে পারি।
এই পোস্টে, আমরা রেইলস ৭ আনবে এমন কিছু নতুন ফিচার এবং পরিবর্তনগুলো দেখব।
Node এবং Webpack আর দরকার নেই
হ্যাঁ, আপনি সঠিক পড়েছেন! রেইলস ৭-এ জাভাস্ক্রিপ্ট আর NodeJS বা Webpack দরকার নেই। এবং আপনি এখনও npm প্যাকেজ ব্যবহার করতে পারেন।
Babel-এ ES6 ট্রান্সপাইল (transpile) করা এবং Webpack-এ বান্ডল (bundle) করা অনেক সেটআপ দরকার। যদিও রেইলস Webpacker জেম দিয়ে এটা খুব ভালো সাপোর্ট করত, এতে অনেক বেগেজ (baggage) আসত, বুঝতে এবং কোনো পরিবর্তন করা কঠিন হত, Особенно আপগ্রেডেবিলিটি (upgradability) মেইনটেইন করার সময়।
এখন, rails new দিয়ে তৈরি নতুন অ্যাপসের ডিফল্ট হল importmaps-rails জেমের মাধ্যমে ইম্পোর্ট ম্যাপস (import maps) ব্যবহার করা। package.json লিখে এবং npm বা yarn দিয়ে ডিপেন্ডেন্সি ইনস্টল করার বদলে, আপনি ./bin/importmap CLI ব্যবহার করবেন ডিপেন্ডেন্সি পিন (pin) (অথবা আনপিন বা আপডেট) করার জন্য।
উদাহরণস্বরূপ, date-fns ইনস্টল করতে:
এটি config/importmap.rb-এ এক লাইন যোগ করবে যেন:
আপনার জাভাস্ক্রিপ্ট কোডে, আপনি আগের মত সব কিছু ব্যবহার করতে পারবেন:
এই সেটআপের সাথে এক জিনিস মনে রাখতে হবে যে আপনি যা লিখছেন এবং ব্রাউজার যা পাচ্ছে তার মাঝপথে কোনো ট্রান্সপাইলিং (transpiling) নেই। অধিকাংশ পার্টের জন্য, এটি ওকে কারণ সব ব্রাউজার যেগুলো মেটার করে এখন ES6 আউট অফ দ্য বক্স সাপোর্ট করে।
তবে এটিও মানে আপনি TypeScript বা JSX ব্যবহার করতে পারবেন না কারণ সেগুলোর জন্য JS-এ ট্রান্সপাইলেশন (transpilation) দরকার যেজের পর ব্যবহার করা যায়।
তাহলে, আপনি যদি React with JSX ব্যবহার করতে চান, আপনাকে এখনো একটি ভিন্ন সেটআপে ফিরে যেতে হবে (webpack/rollup/esbuild ব্যবহার করে)।
রেইলস ৭ আপনার জন্য এটি করতে পারে। আপনার চয়ন করা স্ট্র্যাটেজির সাথে শুধু এক কমান্ড দরকার:
Turbolinks এবং UJS রিপ্লেসড বাই Turbo এবং Stimulus
রেইলস ৭ দিয়ে জেনারেটেড অ্যাপ্লিকেশনগুলো Turbolinks এবং UJS-এর বদলে Turbo এবং Stimulus (Hotwire-র থেকে) ডিফল্টভাবে পাবে। Hotwire একটি নতুন পদ্ধতি যা দ্রুত DOM আপডেট ডেলিভার করে HTML ওয়ার-এ পাঠিয়ে।
ডাটাবেস লেয়ারে এনক্রিপশন (Encryption at Database Layer)
রেইলস ৭ নির্দিষ্ট ডাটাবেস ফিল্ডগুলো এনক্রিপ্টেড (encrypted) চিহ্নিত করার অনুমতি দেয় ActiveRecord::Base-এ encrypts মেথড ব্যবহার করে। এর মানে, একটি ইনিশিয়াল সেটআপের পর, আপনি নিচের মতো কোড লিখতে পারেন:
আপনি এনক্রিপ্টেড অ্যাট্রিবিউটগুলো আগের মত ব্যবহার করতে পারবেন। রেইলস ৭ সেগুলো ডাটাবেস এবং আপনার অ্যাপ্লিকেশনের মাঝপথে অটোমেটিক্যালি এনক্রিপ্ট এবং ডিক্রিপ্ট করবে।
তবে এতে একটি ছোট কুয়ার্ক (quirk) আছে: আপনি সেই ফিল্ড দিয়ে ডাটাবেস কোয়েরি করতে পারবেন না যদি না আপনি deterministic: true অপশন encrypts মেথডে পাস করেন। ডিটারমিনিস্টিক মোড (deterministic mode) ডিফল্ট নন-ডিটারমিনিস্টিক মোড চেয়ে কম সিকিউর (less secure), তাই শুধু সেই অ্যাট্রিবিউটসের জন্য ব্যবহার করুন যেগুলো আপনি অবশ্যই কোয়েরি করতে চান।
অ্যাসিঙ্ক্রোনাস কোয়েরি (Asynchronous Querying)
এখন একটি load_async মেথড আছে যা আপনি ডেটা কোয়েরি করার সময় ব্যবহার করতে পারেন ব্যাকগ্রাউন্ডে রেজাল্ট ফেচ (fetch) করতে। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনাকে একটি কন্ট্রোলার অ্যাকশন থেকে چندین অনরিলেটেড (un-related) কোয়েরি লোড করতে হয়। আপনি করতে পারেন:
এটি দুটি কোয়েরি একই সময়ে ব্যাকগ্রাউন্ডে ফায়ার করবে। তাই, যদি প্রতিটি কোয়েরি ২০০ms নেয়, টোটাল টাইম স্পেন্ট ফেচিং ডেটা হবে ~২০০ms বদলে ৪০০ms, যদি সেগুলো সিরিয়ালি (serially) ফেচ করা হত।
রেইলস ৭-এ Zeitwerk মোড (Zeitwerk Mode for Rails 7)
এটি একটি ব্রেকিং চেঞ্জ (breaking change) পুরনো অ্যাপ্লিকেশনগুলোর জন্য যারা এখনো ক্লাসিক লোডার (classic loader) রান করছে। সকল রেইলস ৭ অ্যাপ্লিকেশন অবশ্যই Zeitwerk মোড ব্যবহার করতে হবে, কিন্তু সুইচ করা খুব সহজ। পূর্ণ Zeitwerk আপগ্রেড গাইড চেক আউট করুন।
অন্যান্য রেইলস ৭ আপডেটস
অনলিমিটেড টাইম জব রিট্রাই (Retry Jobs Unlimited Times)
ActiveJob এখন :unlimited পাস করার অনুমতি দেয় attempts প্যারামিটার হিসেবে retry_on-এ। রেইলস কোনো मैক্সিমাম অটেম্পট (maximum attempts) ছাড়া জবটি অটেম্প্ট করতে থাকবে।
নেমড ভ্যারিয়েন্টস (Named Variants)
আপনি এখন ActiveStorage-এ ভ্যারিয়েন্টস (variants) নাম দিতে পারেন প্রতিবার সাইজ স্পেসিফাই করার বদলে।
Hash থেকে HTML অ্যাট্রিবিউটস (Hash to HTML Attributes)
ভিউসে ব্যবহার করার জন্য একটি নতুন tag.attributes মেথড আছে যা একটি হ্যাশকে HTML অ্যাট্রিবিউটসে ট্রান্সলেট করে:
উৎপন্ন করবে
রুবি debug
ডিবাগিং-র জন্য নতুন ডিফল্ট পরিবর্তন হয়েছে byebug- থেকে debug জেমে।
বদলে byebug কল করার, আপনাকে এখন কোডে debugger কল করতে হবে একটি ডিবাগিং সেশন এন্টার করতে।
sole দিয়ে একটি সিঙ্গেল রেকর্ড অ্যাক্সপেক্ট (Assert) করুন
রেকর্ড কোয়েরি করার সময়, আপনি এখন sole বা find_sole_by কল করতে পারেন (বদলে first বা find_by) যখন আপনি চান কোয়েরিটি শুধু একটি রেকর্ড ম্যাচ করবে বলে অ্যাক্সপেক্ট (assert) করা।
এন অ্যাসোসিয়েশনের প্রেজেন্স/অবসেন্স চেক করুন
আমরা এখন where.associated(:association) ব্যবহার করতে পারি চেক করতে একটি অ্যাসোসিয়েশন একটি রেকর্ডে প্রেজেন্ট কিনা বদলে জয়েন করে এবং একটি আইডির এক্সিস্টেন্স (existence) চেক করার।
কন্ট্রোলার অ্যাকশন থেকে জেনারেটেড ফাইলস স্ট্রিম (Stream Generated Files from Controller Actions)
আপনি এখন একটি কন্ট্রোলার অ্যাকশনের ভিতরে send_stream ব্যবহার করতে পারেন অন-দ-ফ্লাই (on the fly) জেনারেট হচ্ছে একটি ফাইল স্ট্রিমিং শুরু করতে।
এটি ইউজারকে একটি তাত্ক্ষণিক (পার্শিয়াল) রেসপন্স প্রদান করে যাতে তারা জানে কিছু হচ্ছে এবং এর একটি অ্যাডেড বেনিফিট আছে আপনি হেরোকু (Heroku)-এ ডিপ্লয় করলে।
যেহেতু ফাইলটি তাত্ক্ষণিক স্ট্রিমিং শুরু করবে, Heroku কানেকশন টার্মিনেট করবে না। এর মানে আপনাকে ব্যাকগ্রাউন্ড জবস রিসোর্ট (resort) করতে হবে না ৩০ সেকেন্ডের চেয়ে বেশি সময় নেয় এমন একবারের ফাইল জেনারেট করার জন্য।
রেইলস ৭-এ আপগ্রেড করা (Upgrading to Rails 7)
পূর্বের রেইলস ভার্সনগুলোর মত, আপগ্রেড করা সহজ। যদিও আমাদের অফিসিয়াল আপগ্রেড গাইড এখনো নেই, ধাপগুলো একই থাকবে:
- Gemfile-এ রেইলস ভার্সন নম্বর পরিবর্তন করুন (
7.0.0.rc1পাবলিকেশন ডেট পর্যন্ত) এবংbundle updateচালান। bundle exec rails app:updateচালান। ইন্টারঅ্যাক্টিভ CLI ফলো করুন এবং ফাইলগুলো অ্যাড/রিপ্লেস/মডিফাই করুন প্রয়োজন মতো।- আপনার টেস্টস চালান এবং যাচাই করুন সব কিছু এক্সপেক্টেডভাবে কাজ করছে।
সমাপন
রেইলস ৭ রিলিজ নোটসে বাগ ফিক্স, ফিচার, এবং পরিবর্তনগুলোর পূর্ণ তালিকা দেখতে পারেন। এগুলো এখনো কমপ্রিহেনসিভ (comprehensive) নয়, কিন্তু আমরা আশা করি শীঘ্রই আপডেট হবেন।
আপনি যদি এখনো রেইলস ৬ বা তার নিচে রান করছেন, দ্রষ্টব্য যে রেইলস ৭-র ফাইনাল রিলিজের সাথে, রেইলস ৬.১ "security issues only" মোডে প্রবেশ করবে এবং আর কোনো বাগ ফিক্স পাবে না। এটি রেইলস ৫.২-র EOL (End of Life)-ও চিহ্নিত করবে, কারণ সেটি আর কোনো ফিক্স পাবে না।
খুশি কোডিং!
P.S. আপনি যদি রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होतेই পড়তে চান, আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একক পোস্টও মিস করবেন না!
পুলকিত গোয়াল (Pulkit Goyal)
আমাদের অতিথি লেখক পুলকিত একজন সিনিয়র ফুল-স্ট্যাক ইঞ্জিনিয়ার এবং কনসাল্ট্যান্ট। তাঁর ফাঁকা সময়ে, তিনি তার ব্লগে নিজের অভিজ্ঞতা লিখেন।
পুলকিত গোয়াল-এর সব আর্টিকেল