রেইলসের ব্যাটারিজ-ইনক্লুডেড (batteries-included) পদ্ধতি এর সেরা সম্পদ중에 একটি। অন্য কোনো ফ্রেমওয়ার্ক আপনার অ্যাপ্লিকেশনকে এত দ্রুত এবং সহজে শুরু করার সুবিধা দেয় না, আংশিকভাবে রেইলসের জেনারেটর (generators) এর কারণে।
আপনি যদি রেইলস কিছুক্ষণ ব্যবহার করে থাকেন, তবে আপনি জেনারেটরসের সাথে পরিচিত। নতুন অ্যাপ্লিকেশন তৈরি করতে চান? rails new চালান। একসাথে অনেক মডেল এবং ভিউ স্ক্যাফোল্ড (scaffold) করতে চান? rails generate scaffold চালান। আপনার দ্রুত শুরু করতে বা ওয়ার্কফ্লো স্ট্রিমলাইন করতে সাহায্য করার জন্য দर्जনাধিক জেনারেটর উপলব্ধ।
কিন্তু কখনো কখনো, জেনারেটর ব্যবহার করা পর্যাপ্ত নয়। আপনি এই কমান্ডগুলোর আচরণ কাস্টমাইজ করতে চাইতে পারেন বা এমনকি নিজস্ব তৈরি করতে চাইতে পারেন। এই আর্টিকেলে, আমরা জেনারেটরগুলোর ওপর গভীরে নজর দিব — বিশেষ করে, কীভাবে টেমপ্লেটস (templates) ব্যবহার করে আপনার নিজস্ব কাস্টম রেইলস অ্যাপ্লিকেশন তৈরি করতে হয়।
শুরু করা যাক!
রেইলস জেনারেটরস কী?
জেনারেটর ফাংশনস (generator functions) এর সাথে গুলিয়ে নাও (যেগুলো আপনি পাইথন বা জাভাস্ক্রিপ্ট থেকে জানতে পারেন), রেইলস জেনারেটরস কাস্টম থর (Thor) কমান্ডস যেগুলো ফোকাস করে, সি, জেনারেট করা জিনিসগুলোর ওপর।
খুব সारे উদাহরণ আছে। আপনি মডেল জেনারেটর (rails generate model) নতুন ActiveRecord মডেল তৈরি করার জন্য বা মাইগ্রেশন জেনারেটর (rails generate migration) নতুন মাইগ্রেশন জেনারেট করার জন্য পরিচিত হবেন। rails generate generator ও আছে যা — আপনি حدس করেছেন — একটি নতুন জেনারেটর তৈরি করে!।
জেনারেটরস একে অপরকে কল করতে পারে — উদাহরণস্বরূপ, rails scaffold অনেক জেনারেটর কল করবে — এবং ফাইল তৈরি বা মডিফাই করার মেথডস, জেম ইনস্টল করা, নির্দিষ্ট রেক টাস্ক চালানো, এবং আরও অনেক কিছু প্রদান করে। একটি সহজ মডেল স্পেক জেনারেটর তৈরি করে বুঝি এটি কীভাবে কাজ করে।
রুবি অন রেইলসে আপনার নিজস্ব জেনারেটর তৈরি করা
নিচের কমান্ডটি চালান:
এটি /lib/generators/model_spec ফোল্ডারে বেশ কিছু নতুন ফাইল তৈরি করবে। আমরা lib/generators/model_spec/ ফোল্ডারের model_spec_generator.rb মডিফাই করতে পারি একটি মডেল স্পেক ফাইল সঠিক ডিরেক্টরিতে তৈরি করতে:
template কমান্ডটি lib/generators/model_spec/templates ডিরেক্টরিতে একটি টেমপ্লেট ফাইল খুঁজবে এবং এটিকে নির্দিষ্ট লোকেশন — spec/models ডিরেক্টরিতে রেন্ডার করবে। কমান্ডটি টেমপ্লেট ফাইলে পাওয়া ERB-স্টাইল ভেরিয়েবলগুলো রিপ্লেস করবে।
source_root সেট করে, আমরা আমাদের জেনারেটরকে জানিয়ে দিচ্ছি সেটি কোথায় থেকে রেফারেন্সড টেমপ্লেট ফাইলগুলো খুঁজে পাবে। lib/generators/model_spec/templates/ ফোল্ডারের model_spec.rb টেমপ্লেট কিছুটা এর মতো দেখতে পারে:
একবার আপনি সেই ফাইলটি তৈরি করলে, আপনি জেনারেটর চালাতে পারেন একটি নতুন স্পেক ফাইল তৈরি করতে।
বেশ কিছু জেম এই টাইপের জেনারেটরসহ শিপ করা থাকে। আসলে, আমরা Rspec-এ শিপ করা জেনারেটরটির একটি সরলীকৃত ভার্সন তৈরি করেছি। FactoryBot-এ ফ্যাক্টরির জন্য একটি জেনারেটর আছে। আরও অনেক উদাহরণ আছে।
বিভিন্ন জেমের জেনারেটরগুলো আমাদের তৈরি করা একটার চেয়ে বেশি সোফিস্টিকেটেড। আমরা আমাদের জেনারেটরকে আর্গুমেন্টস নেওয়ার বা এমনকি এক্সিস্টিং জেনারেটরসের সাথে হুক করার মতো rails scaffold সক্ষম করতে পারি। রেইলস জেনারেটরস ডকুমেন্টেশন রেফার করুন আপনি যদি আরও শিখতে চান।
তাহলে জেনারেটরস একটি এক্সিস্টিং অ্যাপ্লিকেশনে আপনার ওয়ার্কফ্লো সিম্পলিফাই করার পটেনশিয়াল রাখে। কিন্তু কি আমরা জেনারেটর ব্যবহার করে একটি নতুন অ্যাপ্লিকেশন সেটআপ কাস্টমাইজ করতে পারি?
টেমপ্লেটস (Templates) এंटার করুন!
রুবি অন রেইলসে টেমপ্লেটস (Templates)
নাম অনুযায়ী, টেমপ্লেটস আপনার অ্যাপ্লিকেশন সেটআপ কাস্টমাইজ করার জন্য ফাইলগুলো। এই টেমপ্লেট ফাইলগুলোকে আগে আমরা আলোচনা করেছিলাম সেগুলোর সাথে গুলিয়ে নাও! আন্ডার দ্য হুড (under the hood), এগুলো শুধু জেনারেটরস একই একটি নির্দিষ্ট উদ্দেশ্যের সাথে, যেমন টেমপ্লেট API দ্বারা প্রমাণিত। যদিও জেনারেটরদের সাথে একদম অভিন্ন নয়, তারা খুব সাদৃশ্য।
আপনার যদি একটি এক্সিস্টিং টেমপ্লেট ফাইল থাকে, আপনি এটিকে এভাবে ব্যবহার করতে পারেন:
লোকাল ফাইল স্পেসিফাই করার বদলে, আপনি একটি URLও স্পেসিফাই করতে পারেন। এটি খুবই উপযোগী কারণ এটি আপনাকে অ্যাপ্লিকেশন টেমপ্লেট শেয়ার করার অনুমতি দেয়।
আপনি শুধু rails new চালানোর সময় টেমপ্লেটস ব্যবহার করার জন্য সীমাবদ্ধ নন। আপনি যদি ইতিমধ্যে একটি অ্যাপ সেটআপ করে থাকেন, তবে আপনি পরে টেমপ্লেটস অ্যাপ্লাই করতে পারেন এক্সিকিউট করে:
টেমপ্লেটস অত্যন্ত উপযোগী হতে পারে। কে চায় না প্রতিবার নতুন অ্যাপ তৈরি করার সময় একই কয়েকটি জেম যোগ করা এবং একই কনফিগারেশন পরিবর্তন করা অটোমেট করা? আপনার নিজস্ব অ্যাপ্লিকেশন টেমপ্লেট তৈরি করা চমৎকার মজা — এমনকি যদি এটি দীর্ঘমেয়াদে অনেক টাইম বাঁচায় না।
রেইলসে আপনার নিজস্ব টেমপ্লেট তৈরি করা
আমরা এখন জেনারেটরস এবং টেমপ্লেটস কীভাবে ব্যবহার করবেন সেটি জানি। চলুন একটি সহজ অ্যাপ্লিকেশন টেমপ্লেট তৈরি করি কিছু সেটআপ স্টেপ অটোমেট করতে।
আপনি কীভাবে আপনার রেইলস অ্যাপ সেটআপ করবেন সেটি ব্যক্তিগত পছন্দের ऊपर নির্ভর করে, কিন্তু এখানে একটি উদাহরণ:
- dotenv জেম ইনস্টল করুন।
- ডেভেলপমেন্ট এনভায়রনমেন্টের জন্য একটি
.env.developmentফাইল তৈরি করুন। - ডাটাবেস কনফিগারেশন ফাইলটি এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করার জন্য অ্যাডাপ্ট করুন।
- ঐচ্ছিকভাবে Rspec ইনস্টল এবং সেটআপ করুন।
চলুন একটি লোকাল ফাইল তৈরি করি — mytemplate.rb — এবং gem কমান্ড ব্যবহার করে dotenv যোগ করি।
যেহেতু আমরা শুধু dotenv জেম যোগ করেছি, চলুন আমাদের ডাটাবেস কনফিগারেশন ধারণ করার জন্য একটি .env.development ফাইলও তৈরি করি।
আপনি নির্দিষ্ট কন্টেন্ট সহ একটি নতুন ফাইল তৈরি করতে পারেন create_file ব্যবহার করে। আপনি টেমপ্লেট বা জেনারেটর ডকুমেন্টেশনে এটি খুঁজে পাবেন না, কারণ মেথডটি থর (Thor) দ্বারা সরবরাহ করা হয়। আপনি আলিয়াস file ও খুঁজে পেতে পারেন। অ্যাপ্লিকেশন টেমপ্লেটগুলো Rails::Generators::AppGenerator কনটেক্সটে ইভ্যালুয়েট হয়, এবং সেটিই সঠিক জায়গা যেখানে file আলিয়াস ডিফাইন করা আছে।
app_name ভেরিয়েবলটিতে rails new এর প্রথম আর্গুমেন্ট থাকে। এই ভেরিয়েবল ব্যবহার করে, আমরা নিশ্চিত করতে পারি আমাদের কনফিগ ফাইল জেনারেটেড অ্যাপ্লিকেশন সাথে মেলে।
পরবর্তী, চলুন আমাদের এনভায়রনমেন্ট ভেরিয়েবলস ব্যবহার করি ডাটাবেসের সাথে কানেক্ট করতে। আমরা পুরো config/database.yml ওভাররাইট করতে পারতাম create_file কমান্ড ব্যবহার করে, কিন্তু চলুন এটিকে মডিফাই করি inject_into_file ব্যবহার করে।
আমরা after আর্গুমেন্টের সাথে স্ট্রিংস বা রেজেক্স (regex) উভয় ব্যবহার করতে পারি কন্টেন্ট কোথায় ইনজেক্ট হবে সেটি স্পেসিফাই করতে।
অবশ্য, এই ধরনের কনফিগারেশন শুধু তখন সენ্স মেক করে যখন ইউজার SQLite-ওয়ালা অ্যাপ্লিকেশন তৈরি করছে না। আপনি নির্দিষ্ট আর্গুমেন্টস উপস্থিতি চেক করতে পারেন options ভেরিয়েবল ব্যবহার করে। সেরা হবে আপনি রেইলসের অ্যাপ জেনারেটর এর সোর্স কোড পড়েন যেন কোন অপশনগুলো উপলব্ধ সেটা দেখতে পান।
শেষ কিন্তু কম গুরুত্বপূর্ণ নয়, চলুন ইউজারদের Rspec ইনস্টল করার অনুমতিও দিই যদি তারা চায়। ইউজার ইনপুট নেওয়ার এবং ইন্টারঅ্যাক্টিভ টেমপ্লেট তৈরি করার বিভিন্ন মেথড আছে। yes? মেথড ইউজার থেকে কনফার্মেশন চায়:
আমরা ইতিমধ্যে gem মেথড জানি, কিন্তু generate এবং after_bundle নতুন।
আগে বলা অনুযায়ী, Rspec নিজস্ব জেনারেটরস যোগ করে, এবং আপনি এই জেনারেটরগুলো (অথবা যেকোনো অন্য, সেটা মэтার করে না) সরাসরি আপনার টেমপ্লেট থেকে কল করতে পারেন। কিন্তু একটি ক্যাচ আছে — gem মেথড দিয়ে স্পেসিফাইড জেমগুলো টেমপ্লেটের শেষে ইনস্টল হয়। generate কল করা এমন একটি জেম দ্বারা সরবরাহ করা জেনারেটরসহ ফেইল করবে — যাই হোক, এই কারণেই আপনাকে কমান্ডটি after_bundle এর সাথে কলব্যাক হিসেবে রেজিস্টার করা উচিত।
দ্রষ্টব্য: আমরা শেষ করার আগে, ফাইল তৈরি বা মডিফাই করার সম্পর্কে একটি কুইক ওয়ার্ড। আমরা create_file এবং inject_into_file ব্যবহার করেছি, কিন্তু আরও অনেক অপশন আছে। আপনি বিভিন্ন টেমপ্লেট পড়ার সময় copy_file বা template দেখতে পারেন। আমি এগুলো এখানে মেনশন করিনি জিনিসগুলো সিম্পল রাখার জন্য। আপনি যদি আরও অ্যাডভান্সড টেমপ্লেট তৈরি করতে চান, তবে আপনাকে জানতে হবে ফাইল হ্যান্ডল করার এই অন্যান্য মেথডগুলো আছে।
ফলাফল: রেইলসে ফাইনাল টেমপ্লেট
ফাইনাল টেমপ্লেটটি এরকম দেখাবে:
আপনি এই নির্দিষ্ট টেমপ্লেট টেস্ট করতে পারেন চালিয়ে:
অথবা:
কাস্টম ডাটাবেস কনফিগারেশনের সুবিধা নেওয়ার জন্য।
বোঝা যাক, এই ফাইলটি গিটহাব গিস্ট (GitHub gist) হিসেবে শেয়ার করার জন্য পরিপূর্ণভাবে উপযুক্ত। আপনার প্রয়োজন অনুযায়ী অ্যাডাপ্ট করুন, আপলোড করুন, এবং তারপর আপনার সহকর্মী, বন্ধু, এবং যেকোনো যারা আপনার কাস্টম অ্যাপ টেমপ্লেটে আগ্রহী তাদের সাথে শেয়ার করুন 😉।
রেইলস জেনারেটরস এবং টেমপ্লেটস সম্পর্কে আরও জানুন
দ 말할 দরকার নেই, আমরা এখানে শুধু поверх কথা বললাম।
প্রত্যেকের রেইলস অ্যাপ লিখতে এবং ডেভেলপ করার আলাদা পছন্দ আছে, তাই वहाँ অসংখ্য জেনারেটর এবং অ্যাপ্লিকেশন টেমপ্লেট আউট দেয়ার আছে। আপনি সেগুলো পড়ে নির্দিষ্ট কাস্টমাইজেশন করার বিষয়ে অনেক শিখতে পারেন। আমি ক্রিস অলিভারের Jumpstart এবং RailsBytes রিকমেন্ড করি, দ্বিতীয়টি একটি কমিউনিটি-কিউরেটেড টেমপ্লেট সংগ্রহ।
Thoughtbot-এর Suspendersও আছে, যেটি আমাকে রেইলস জেনারেটর এবং টেমপ্লেটস নিয়ে গভীরে খোঁজা করতে অনুপ্রেরণা দিয়েছিল। আমি নিজের একটি অ্যাপ্লিকেশন টেমপ্লেটও লিখেছি — Schienenzeppelin — যা, আপ-টু-ডেট না হলেও, এখনো কিছু অনুপ্রেরণা দিতে পারে।
সমাপন: রুবি অন রেইলস জেনারেটরস এবং টেমপ্লেটস দিয়ে শুরু করুন
এই পোস্টে, আমরা রেইলস জেনারেটরসের বেসিক্স এবং সেগুলো কীভাবে ব্যবহার করা হয় সেটি দেখেছি। আমরা আমাদের নিজস্ব জেনারেটর তৈরি করেছি নতুন মডেল স্পেক লিখতে সহজ করতে।
তারপর, আমরা টেমপ্লেটস-এ গভীরে গিয়েছি এবং শিখেছি কীভাবে আপনি একটি সহজ টেমপ্লেট তৈরি করতে পারেন আপনার অ্যাপ্লিকেশন সেটআপ কাস্টমাইজ করতে। এটি কিছুটা কাজ হলেও, কিন্তু পুরস্কারদায়কও। আপনার নিজস্ব টেমপ্লেট লিখা আপনার চাহিদা না হলে, অনলাইনে থেকে বেছে নেওয়ার জন্য অনেক এক্সিস্টিং টেমপ্লেট আছে!
খুশি টেমপ্লেটিং!
P.S. আপনি যদি রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होतेই পড়তে চান, আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একক পোস্টও মিস করবেন না!
হ্যান্স-ইয়াপ শ্নেডলিটজ (Hans-Jörg Schnedlitz)
আমাদের অতিথি লেখক হ্যান্স ভিয়েনা, অস্ট্রিয়া থেকে একজন রেইলস ইঞ্জিনিয়ার। তিনি অধিকাংশ সময় কোডিং বা কোডিং সম্পর্কে পড়তে ব্যয় করেন, এবং কখনো কখনো তার ব্লগে এ সম্পর্কে লিখেন! যখন তিনি স্ক্রিনের সামনে নন, তখন আপনি তাকে সম্ভবত বাইরে পাবেন, কোনো পর্বত চড়তে।
হ্যান্স-ইয়াপ শ্নেডলিটজ-এর সব আর্টিকেল