কম্পিউটার

রেল 7-এ নতুন কি আছে

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

এই পোস্টে, আমরা কিছু নতুন বৈশিষ্ট্য এবং পরিবর্তন দেখব যা Rails 7 আনবে।

নোড এবং ওয়েবপ্যাক প্রয়োজন নেই

হ্যাঁ, আপনি যে অধিকার পড়া! Rails 7-এ JavaScript-এর আর NodeJS বা Webpack প্রয়োজন হবে না। এবং আপনি এখনও npm প্যাকেজ ব্যবহার করতে পারেন।

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

এখন, rails new দিয়ে তৈরি নতুন অ্যাপের জন্য ডিফল্ট importmaps-rails-এর মাধ্যমে মানচিত্র আমদানি করা gem. একটি 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"

আপনার জাভাস্ক্রিপ্ট কোডে, আপনি আগের মতো সবকিছু ব্যবহার চালিয়ে যেতে পারেন:

import { formatDistance, subDays } from "date-fns";
 
formatDistance(subDays(new Date(), 3), new Date(), { addSuffix: true });
//=> "3 days ago"

এই সেটআপের সাথে একটি জিনিস মনে রাখবেন যে আপনি যা লিখবেন এবং ব্রাউজারটি কী পাবে তার মধ্যে কোনও স্থানান্তর নেই। বেশিরভাগ ক্ষেত্রে, এটি ঠিক আছে যেহেতু গুরুত্বপূর্ণ সমস্ত ব্রাউজার এখন ES6 সমর্থন করে বাক্সের বাইরে৷

কিন্তু এর মানে হল যে আপনি TypeScript বা JSX ব্যবহার করতে পারবেন না কারণ তাদের ব্যবহারের আগে JS-এ ট্রান্সপিলেশন প্রয়োজন।

সুতরাং, আপনি যদি JSX এর সাথে প্রতিক্রিয়া ব্যবহার করতে চান তবে আপনাকে এখনও একটি ভিন্ন সেটআপে ফিরে যেতে হবে (ওয়েবপ্যাক/রোলআপ/এসবিল্ড ব্যবহার করে)।

Rails 7 আপনার জন্য এটি করতে পারে। আপনার যা দরকার তা হল আপনার নির্বাচিত কৌশল সহ একটি কমান্ড:

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

Turbolinks এবং UJS Turbo এবং Stimulus দ্বারা প্রতিস্থাপিত হয়

Rails 7 এর মাধ্যমে তৈরি করা অ্যাপ্লিকেশনগুলি Turbolinks এবং UJS এর ​​পরিবর্তে ডিফল্টরূপে Turbo এবং Stimulus (Hotwire থেকে) পাবে। হটওয়্যার হল একটি নতুন পদ্ধতি যা তারের উপর এইচটিএমএল পাঠিয়ে DOM-এ দ্রুত আপডেট সরবরাহ করে৷

ডেটাবেস স্তরে এনক্রিপশন

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

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

এটি একই সময়ে পটভূমিতে উভয় প্রশ্ন ফায়ার করবে। সুতরাং, যদি প্রতিটি ক্যোয়ারী 200ms লাগে, ডেটা আনার জন্য মোট সময় ব্যয় করা হয় 400ms এর পরিবর্তে ~200ms, যদি সেগুলিকে সিরিয়ালি আনা হয়৷

রেলের জন্য Zeitwerk মোড 7

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

অন্যান্য রেল 7 আপডেট

চাকরি আনলিমিটেড টাইম পুনরায় চেষ্টা করুন

ActiveJob এখন :unlimited পাস করার অনুমতি দেয় 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

এটি ব্যবহারকারীকে একটি তাত্ক্ষণিক (আংশিক) প্রতিক্রিয়া প্রদান করে যাতে তারা জানে যে কিছু ঘটছে এবং আপনি যদি Heroku এ স্থাপন করেন তাহলে একটি অতিরিক্ত সুবিধা রয়েছে৷

যেহেতু ফাইলটি অবিলম্বে স্ট্রিমিং শুরু হবে, হেরোকু সংযোগটি বন্ধ করবে না। এর মানে হল যে 30 সেকেন্ডের বেশি সময় নেয় এমন এক-অফ ফাইল তৈরি করতে আপনাকে ব্যাকগ্রাউন্ড কাজগুলি অবলম্বন করতে হবে না।

রেল 7 এ আপগ্রেড করা হচ্ছে

রেলের পূর্ববর্তী সংস্করণগুলির মতো, আপগ্রেড করা সহজ। যদিও আমাদের কাছে এখনও কোনও অফিসিয়াল আপগ্রেড গাইড নেই, পদক্ষেপগুলি একই থাকবে:

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

রেপ আপ

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

আপনি যদি এখনও Rails 6 বা তার নিচের দিকে চালান, অনুগ্রহ করে মনে রাখবেন যে Rails 7-এর চূড়ান্ত প্রকাশের সাথে, Rails 6.1 "শুধুমাত্র নিরাপত্তা সমস্যা" মোডে প্রবেশ করবে এবং আর বাগ ফিক্স পাবে না। এটি Rails 5.2-এর জন্য EOL-কেও চিহ্নিত করবে, যেহেতু এটি আর কোনো সংশোধন পাবে না।

মজা করুন কোডিং!

পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্ট মিস করবেন না!


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

  2. রেলে রুবি কি এবং কেন এটি দরকারী?

  3. iOS 13.3 সংস্করণে নতুন কী আছে

  4. Android 12 ডেভেলপার প্রিভিউ 1 এ নতুন কি আছে