রেইলসে রেন্ডারিং কী?
রেন্ডারিং হলো আপনার রুবি অন রেইলস অ্যাপ্লিকেশনের চূড়ান্ত লক্ষ্য। আপনি একটি ভিউ রেন্ডার করেন, সাধারণত .html.erb ফাইলগুলো, যাতে এইচটিএমএল এবং রুবি কোডের মিশ্রণ থাকে।
একটি ভিউ হলো যা ইউজার দেখে।
এটি আপনার রেইলস অ্যাপের সকল কাজের ফলাফল। ভিউগুলো লজিক, ডেটা এবং ভিউ টেমপ্লেট কম্বাইন করে ইউজারের রিকোয়েস্ট সার্ভ করে।
JSON রেসপন্স রিটার্ন করাও একটি ভিউ মाना যেতে পারে।
এইीलिये রেইলসের রেন্ডারিং সিস্টেম সম্পর্কে যতটা পারেন শিখুন যদি আপনি না চান আপনার সকল म्हনত ব্যর্থ হয়।
রেইলসে রেন্ডারিং কিছু আশ্চর্যजनক আচরণ দিতে পারে। তাই যত বেশি জানবেন তত ভালো।
চলুন বেসিকগুলোতে শুরু করি!
ভিউ রেন্ডারিং-এর বেসিকস
ডিফল্টলি, আপনাকে রেইলসে কিছু রেন্ডার করার কথা বলতে হয় না এবং ভিউগুলো কাজ করবে যতক্ষণ না সবকিছু সঠিকভাবে সেট আপ থাকে।
এটি "কনভেনশন ওভার কনফিগারেশন"-এর অংশ।
এটি কীভাবে কাজ করে?
রেইলস কিছু অনুমান করে, যা আপনি জানতে পারেন না।
এটি আপনার কাজ বাঁচায়।
কিন্তু আপনি যদি না জানেন কী হচ্ছে তবে এটি যাদুই লাগতে পারে।
ইহানই আপনি ঝামেলায় পড়তে পারেন!
এই নির্দিষ্ট ক্ষেত্রে, রেইলস যা অনুমান করে তা হলো আপনি অনুরোধ হ্যান্ডল করার কন্ট্রোলার একশনের মতো একই নামের টেমপ্লেট রেন্ডার করতে চান।
সুতরাং যদি আপনি BooksController#index কল করেন... রেইলস books/index.erb রেন্ডার করে।
এখন:
আপনি এই রেন্ডারিংয়ের ওপর আরও কন্ট্রোল পেতে পারেন।
এটি আপনাকে ডিফল্ট থেকে আলাদা একটি ভিউ রেন্ডার করতে দেয়।
এখানে কীভাবে:
class BooksController < ApplicationController def index render :listing end end
এটি books/listing.erb রেন্ডার করবে (বা .haml যদি আপনি HAML ভিউ ব্যবহার করেন)।
আপনি সিম্বলের বদলে স্ট্রিংও ব্যবহার করতে পারেন।
এভাবে:
render 'shared/buttons'
রেইলস shared/buttons.erb রেন্ডার করবে।
একটি জিনিস যা আপনাকে জানা দরকার
অন্য একটি একশনের সাথে জড়িত ভিউ রেন্ডার করলে সেই একশনটি রান হবে না।
অন্য কথায়, create-এর ভিতরে render :index কল করলে index মেথডটি রান হবে না।
এটি কেন গুরুত্বপূর্ণ?
কারণ সেই ভিউর জন্য ইনস্ট্যান্স ভেরিয়েবলগুলো সেট হবে না!
আপনাকে নিজে সেট করতে হবে।
উদাহরণ:
def index @users = User.all end # এখানে `@users` মিস করলে এরর হবে বা খালি ইনডেক্স ভিউ দেখাবে # আপনি সেক্ষেত্রে `redirect_to` ব্যবহার করতে পারেন, সেক্ষেত্রে `index` রান হবে def create render :index end
রেন্ডারিং সম্পর্কে আরও অনেক কিছু আছে।
চলুন আগে বড়ই!
বিভিন্ন ধরনের রেন্ডারিং
টেমপ্লেট রেন্ডার করার বাশিতে আপনার অন্যান্য অপশনও রয়েছে।
আপনি পারেন:
- এইচটিএমএল স্ট্রিং রেন্ডার করা
- প্লেইন টেক্সট স্ট্রিং রেন্ডার করা
- JSON রেন্ডার করা
স্ট্রিং রেন্ডার করা ডেভেলপমেন্টের সময় সাহায্যকারী হতে পারে যদি আপনার पास এরর হ্যান্ডেল করার প্রপার টেমপ্লেট না থাকে।
বা আপনি কোনো নির্দিষ্ট কন্ট্রোলার একশনের জন্য ভিউ লিখতে প্রস্তুত নন।
এখানে একটি উদাহরণ:
if @user render :show else render plain: "User not found." end
JSON সরাসরি রেন্ডার করা একটি সিম্পল API বানাতে ব্যবহার করা যায়, এটি সেরা পদ্ধতি নয় কিন্তু শুরুতে সাহায্য করতে পারে।
উদাহরণ:
render json: @user
আমি render HTML ব্যবহার করিনি, কিন্তু আপনার যদি এর জন্য কোনো ভালো ইউজ কেস থাকে তবে আমাকে জানান!
পারশিয়াল কীভাবে রেন্ডার করবেন
রেন্ডারিং কন্ট্রোলারের বাইরেও যায়।
আপনি ভিউয়ের ভিতরে ভিউ রেন্ডার করতে পারেন।
একে আমরা পারশিয়াল বলি।
আপনি কেন এটি করবেন?
ক্লিনার কোড এবং কোড রি-ইউজ।
আপনি যদি ৩টি আলাদা পেজে একই ফর্ম ব্যবহার করেন তবে এটি একটি পারশিয়ালে এক্সট্রাক্ট করা ভালো আইডিয়া।
এখন পরিবর্তন করতে চাইলে আপনাকে শুধু এক জায়গায় করতে হবে।
এখানে একটি উদাহরণ:
<%= render :form %>
এটি কাজ করার জন্য আপনার ভিউ ফাইলের নাম আন্ডারস্কোর দিয়ে শুরু করতে হবে, যেমন _form.erb, কিন্তু render কল করার সময় আন্ডারস্কোর লাগবে না।
আপনি পারশিয়াল থেকে ইনস্ট্যান্স ভেরিয়েবল এক্সেস করতে পারবেন...
কিন্তু লোকাল ভেরিয়েবলগুলো কী?
আপনি এভাবে করতে পারেন:
<%= render :form, message: "Apples Are Good" %>
এটি আপনাকে আপনার পারশিয়ালে message নামে একটি লোকাল ভেরিয়েবল দেবে।
পরবর্তীতে:
আপনি শিখবেন কীভাবে শুধু একটি render কল দিয়ে একাধিক জিনিস রেন্ডার করতে হয়!
কলেকশন কীভাবে রেন্ডার করবেন
পারশিয়াল লুপ ছাড়া কলেকশন রেন্ডার করতে সাহায্য করে।
ধরুন আপনি @books রেন্ডার করছেন।
আপনি এভাবে করতে পারেন:
<%= render @books %>
এটি কাজ করবে যদি আপনার पास _book.erb পারশিয়াল থাকে এবং আপনি সেটেমপ্লেটে book ভেরিয়েবল ব্যবহার করেন।
উদাহরণ:
# app/views/books/_book.erb <%= image_tag(book.cover) %><%= book.title %>
<%= book.author %> <%= link_to "Read Book", book %>
যদি আপনার কারেন্ট বুক নম্বর লাগে (CSS ক্লাসের জন্য) তবে আপনি book_counter ব্যবহার করতে পারেন।
এখানে book_ হলো আপনার মডেলের নাম।
আমার মতে কলেকশন রেন্ডারিং রেইলসের সেরা ফিচারগুলোতে একটা!
রেইলস লেআউট বুঝতে
আপনি নতুন একটি রেইলস অ্যাপ তৈরি করলে ভিউ ফোল্ডারের নিচে "layouts" ফোল্ডার পাবেন।
সেখানে application.html.erb ফাইলটি পাবেন।
সেটিই ডিফল্ট লেআউট!
লেআউট কী?
একটি লেআউট আপনাকে আপনার সাইটকে একটি কনসিস্টেন্ট লুক দিতে দেয়।
এটি হলো:
- মেনু
- ফুটার
- CSS এবং জাভাস্ক্রিপ্ট ফাইল লোড করা...
অনেক সময় ডিফল্ট লেআউটই পর্যাপ্ত।
কিন্তু যদি আপনি কোনো নির্দিষ্ট পেজের জন্য আলাদা লেআউট চান?
আপনি layout অপশন ব্যবহার করতে পারেন।
উদাহরণ:
render :index, layout: 'admin'
আপনি লেআউট ডিজেবলও করতে পারেন:
render :index, layout: false
এবং আপনি কন্ট্রোলার লেভেলেও লেআউট সেট করতে পারেন।
এভাবে:
class AdminsController < ApplicationController layout 'admin' end
রেন্ডারিং একশন খতম করে না
একটি সাধারণ বিভ্রান্তি হলো ভাবা যে কন্ট্রোলার একশনের ভিতরে রেন্ডারিং (এবং রিডাইরেক্টিং) করলে সেটার পরের কোড আর রান হবে না।
আপনি এই সমস্যাকে ফেস করতে পারেন যদি একাধিকবার render কল করেন।
উদাহরণ:
def create if yellow_fruit? render :bananas end render :apples end
এটি এরর দেবে কারণ render :apples সবসময় রান হবে এবং আপনি একই কন্ট্রোলার একশনে দুবার রেন্ডার করতে পারবেন না।
সমাধানটি:
def create if yellow_fruit? render :bananas else render :apples end end
আরেকটি অপশন হলো render-এর পর return কীওয়ার্ড ব্যবহার করা, কিন্তু ক্লারিটির জন্য মেথডের মাঝপথে return স্টেটমেন্ট এড়ানো ভালো।
সারসংক্ষেপ
আপনি রুবি অন রেইলসে অত্যন্ত গুরুত্বপূর্ণ টপিক রেন্ডারিং সম্পর্কে শিখেছেন।
রেন্ডারিং আপনাকে আপনার অ্যাপ্লিকেশনের ইউজারদের কন্টেন্ট রিটার্ন করতে দেয় এবং এটি আপনার কন্ট্রোলার একশনের ফাইনাল স্টেপগুলোর একটা। রেন্ডারিং বুঝতে পারলে আপনি আরও ভালো রেইলস অ্যাপ্লিকেশন লিখতে পারবেন।
এখন আপনার পালা, আপনার এডিটর খুলুন এবং কোডিং স্কিল অনুশীলন করুন।
পড়ার জন্য ধন্যবাদ!