কম্পিউটার টিউটোরিয়াল

Rails 7: রিলিজের আগে মূল ফিচার ও উন্নতি

Rails 7 খুব দ্রুত আসছে। কনফার্মড রিলিজ ডেট নেই, কিন্তু ক্রিসমাসের আগে উপলব্ধ হওয়া আশা করা হয়, তাই আর অনেক দের নেই। এই পোস্ট পাবলিশ হওয়ার সময় লেটেস্ট ভার্সন হলো 7.0.0.rc1, প্রথম রিলিজ ক্যান্ডিডেট। Basecamp, HEY, Github, এবং Shopify সবই রেইলস ৭ আলফা প্রোডাকশনে চালাচ্ছে, তাই রিলিজ ক্যান্ডিডেটও প্রায় স্ট্যাবল হইব।

এই পোস্টে, আমরা Rails 7 আনবে এমন কিছু নতুন ফিচার ও পরিবর্তন দেখব।

Node এবং Webpack আবশ্যক নয়

হ্যাঁ, আপনি সঠিক পড়েছেন! Rails 7-এ JavaScript-এর জন্য আর NodeJS বা Webpack লাগবে না। এবং আপনি এখনও npm প্যাকেজ ব্যবহার করতে পারবেন।

Babel দিয়ে ES6 ট্রান্সপাইল এবং Webpack দিয়ে বান্ডেলিং অনেক সেটআপ দরকার পড়ে। রেইলস Webpacker জেম দিয়ে এটাকে ভালোভাবে সাপোর্ট করত, কিন্তু এতে অনেক ব আঁকা থাকত, বুঝতে ও পরিবর্তন করতে কঠিন, বিশেষ করে আপগ্রেডেবিলিটি মেইনটেইন করার সময়।

এখন, rails new দিয়ে তৈরি নতুন অ্যাপের ডিফল্ট হবে import maps 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 with JSX ব্যবহার করতে চাইলে, আপনাকে ভিন্ন সেটআপে ফিরে যেতে হবে (webpack/rollup/esbuild ব্যবহার করে)।

Rails 7 আপনার জন্য এটি করতে পারে। শুধু আপনার পছন্দের স্ট্র্যাটেজি দিয়ে এক কমান্ড চালান:

$ ./bin/rails javascript:install:[esbuild|rollup|webpack]

Turbolinks এবং UJS প্রতিস্থাপিত Turbo এবং Stimulus

Rails 7 দিয়ে জেনারেট হওয়া অ্যাপ্লিকেশনগুলোর ডিফল্ট হবে Turbo এবং Stimulus (Hotwire থেকে), Turbolinks এবং UJS-এর বদলে। Hotwire একটি নতুন পদ্ধতি যা HTML ওয়ায়ারের মাধ্যমে পাঠিয়ে DOM-এ দ্রুত আপডেট ডেলিভার করে।

ডাটাবেস লেয়ারে এনক্রিপশন

Rails 7 নির্দিষ্ট ডাটাবেস ফিল্ডকে এনক্রিপ্টেড হিসেবে মার্ক করার অনুমতি দেয় ActiveRecord::Base-এ encrypts মেথড ব্যবহার করে। এর মানে, প্রাথমিক সেটআপের পর, আপনি নিচের মতো কোড লিখতে পারবেন:

class Message < ApplicationRecord
  encrypts :text
end

আপনি এনক্রিপ্টেড অ্যাট্রিবিউটগুলোকে অন্য অ্যাট্রিবিউটের মতো ব্যবহার করতে পারবেন। Rails 7 ডাটাবেস এবং আপনার অ্যাপ্লিকেশনের মধ্যে স্বয়ংক্রিয়ভাবে এনক্রিপ্ট ও ডিক্রিপ্ট করবে।

কিন্তু একটা ছোট ক্যুয়ার্ক আছে: আপনি সেই ফিল্ড দিয়ে ডাটাবেস কোয়েরি করতে পারবেন না, যতক্ষণ না deterministic: true অপশন encrypts মেথডে পাস করেন। ডিটারমিনিস্টিক মোড ডিফল্ট নন-ডিটারমিনিস্টিক মোডের চেয়ে কম সিকিউর, তাই শুধু সেই অ্যাট্রিবিউটের জন্য ব্যবহার করুন যেগুলো আপনার জরুরি কোয়েরি করতে হবে।

অ্যাসিনক্রোনাস কোয়েরিিং

এখন একটি load_async মেথড আছে যা ডেটা কোয়েরি করার সময় ব্যবহার করে ফলাফল ব্যাকগ্রাউন্ডে ফেচ করতে। এটি স্পেশালি গুরুত্বপূর্ণ যখন একাধিক অনুলিখিত কোয়েরি কন্ট্রোলার অ্যাকশন থেকে লোড করতে হয়। আপনি করতে পারেন:

def PostsController
  def index
    @posts = Post.load_async
    @categories = Category.load_async
  end
end

এটি দুটি কোয়েরি একসাথে ব্যাকগ্রাউন্ডে ফায়ার করবে। তাই, যদি প্রতিটি কোয়েরি ২০০ms লাগে, মোট টাইম ~২০০ms হবে ৪০০ms-এর বদলে, যদি সিরিয়ালি ফেচ করা হতো।

Rails 7-এ Zeitwerk মোড

এটি একটি ব্রেকিং চেঞ্জ পুরনো অ্যাপ্লিকেশনের জন্য যেগুলো এখনও ক্লাসিক লোডার চলে। সকল Rails 7 অ্যাপ্লিকেশন অবশ্যই Zeitwerk মোড ব্যবহার করতে হবে, কিন্তু সইচ করা খুব সহজ। পূর্ণ Zeitwerk আপগ্রেড গাইড দেখুন।

Rails 7-এর অন্যান্য আপডেট

জব আনলিমিটেড টাইম রিট্রাই

ActiveJob এখন :unlimited পাস করার অনুমতি দেয় retry_on-এ attempts প্যারামিটার হিসেবে। রেইলস জবটি কোনো Мак্সিমাম অটেম্প্ট ছাড়া চেষ্টা চালিয়ে যাবে।

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) %>

Hash থেকে HTML অ্যাট্রিবিউট

ভিউতে ব্যবহার করার জন্য একটি নতুন tag.attributes মেথড আছে যা hash কে HTML অ্যাট্রিবিউটে রূপান্তর করে:

<input <%= tag.attributes(type: :text, aria: { label: "Search" }) %>>

এটি প্রোডিউস করবে:

<input type="text" aria-label="Search" />

Ruby debug

ডিবাগিং-এর নতুন ডিফল্ট পরিবর্তন হয়েছে byebug-থেকে debug জেমে।

এখন কোডে byebug কল করার বদলে debugger কল করতে হবে ডিবাগিং সেশন শুরু করতে।

sole দিয়ে সিঙ্গেল রেকর্ড অ্যাসার্ট

রেকর্ড কোয়েরি করার সময়, আপনি এখন sole বা find_sole_by কল করতে পারেন ( first বা find_by-এর বদলে) যখন আপনি চান কোয়েরি শুধু একটি রেকর্ড ম্যাচ করুক।

Product.where(["price = %?", price]).sole
# => ActiveRecord::RecordNotFound (যদি দিয়ে প্রাইসের সাথে কোনো প্রোডাক্ট নেই)
# => #<Product ...> (যদি একটি প্রোডাক্ট থাকে)
# => ActiveRecord::SoleRecordExceeded (যদি একাধিক প্রোডাক্ট থাকে)
user.api_keys.find_sole_by(key: key) # উপরের মতো

অ্যাসোসিয়েশনের প্রেজেন্স/অবসেন্স চেক

এখন where.associated(:association) ব্যবহার করে চেক করা যায় কোনো রেকর্ডে অ্যাসোসিয়েশন আছে কিনা, JOIN করে ID existencia চেক করার বদলে।

# 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

এটি ইউজারকে তাত্ক্ষণিক (পার্শিয়াল) রেসপন্স দেয় যাতে তারা বুঝতে পারে কিছু হচ্ছে, এবং Heroku-তে ডিপ্লয় করলে অতিরিক্ত সুবিধা আছে।

যেহেতু ফাইলটি স্ট্রিমিং শুরু করবে অবিলম্বে, Heroku কানেকশন টার্মিনেট করবে না। এর মানে আপনাকে ব্যাকগ্রাউন্ড জব ব্যবহার করতে হবে না একবারের ফাইল জেনারেট করতে যা ৩০ সেকেন্ডের বেশি টাইম নেয়।

Rails 7-এ আপগ্রেড করা

পূর্বের রেইলস ভার্সনের মতো, আপগ্রেড করা সহজ। অফিসিয়াল আপগ্রেড গাইড এখনো নেই, কিন্তু স্টেপগুলো একই থাকবে:

  1. Gemfile-এ রেইলস ভার্সন নম্বর পরিবর্তন করুন (7.0.0.rc1 পাবলিকেশন ডেট পর্যন্ত) এবং bundle update রান করুন।
  2. bundle exec rails app:update রান করুন। ইন্টারঅ্যাক্টিভ CLI ফলো করুন এবং ফাইলগুলো যোগ/রিপ্লেস/মডিফাই করুন।
  3. আপনার টেস্ট রান করুন এবং সবকিছু এক্সপেক্টেডলি কাজ করছে কিনা ভেরিফাই করুন।

র‍্যাপ আপ

Rails 7 রিলিজ নোটসে বাগ ফিক্স, ফিচার, এবং পরিবর্তনের পূর্ণ লিস্ট দেখতে পারেন। এগুলো এখনো কমপ্রিহেনসিভ নয়, কিন্তু শীঘ্রই আপডেট হওয়া আশা করা হয়।

যদি আপনি এখনো Rails 6 বা নিচে রান করছেন, মনে রাখবেন Rails 7 ফাইনাল রিলিজের সাথে, Rails 6.1 "security issues only" মোডে যাবে এবং আর বাগ ফিক্স পাবে না। এছাড়া Rails 5.2-এর EOLও চিহ্নিত হবে, কারণ সেটি আর কোনো ফিক্স পাবে না।

হ্যাপি কোডিং!

P.S. Ruby Magic পোস্টগুলো প্রেস থেকে বের होतेই পেতে চাইলে, আমাদের Ruby Magic নিউজলেটার সাবস্ক্রাইব করুন এবং কোনো পোস্ট মিস করবেন না!

  1. ফেসবুকের লিব্রা ক্রিপ্টোকারেন্সি: কী হচ্ছে?

  2. Ruby on Rails মাস্টারিং: এই প্রমাণিত ফ্রেমওয়ার্ক দিয়ে দ্রুত পাওয়ারফুল ওয়েব অ্যাপ বানান

  3. iOS 13.3 অন্বেষণ: নতুন ফিচার, ফিক্স এবং উন্নতি

  4. অ্যান্ড্রয়েড ১২ ডেভেলপার প্রিভিউ ১: মূল ফিচার ও সিকিউরিটি এনহ্যান্সমেন্ট