Rails অ্যাপ্লিকেশনে Nested Resources এবং Nested Routes ব্যবহার করা হয় যখন একটি রিসোর্স (যেমন Post) অন্য একটি রিসোর্স (যেমন Comment) এর সাথে সম্পর্কিত থাকে। এটি উপসম্পদ (Sub-resources) তৈরি করতে সহায়তা করে, যা সম্পর্কিত রিসোর্সগুলোকে আরও সংগঠিত এবং পাঠযোগ্য করে তোলে।
Nested Resources কী?
Nested Resources হল এমন একটি কাঠামো যেখানে একটি রিসোর্স (যেমন, Comment) আরেকটি রিসোর্স (যেমন, Post) এর অন্তর্ভুক্ত (nested) হয়। এটি তখন ব্যবহার করা হয় যখন একটি রিসোর্স অন্য রিসোর্সের মধ্যে পিতামাতার সম্পর্ক (parent-child relationship) তৈরি করে।
উদাহরণস্বরূপ, একটি Post এর একাধিক Comment থাকতে পারে। এই ধরনের সম্পর্ক সঠিকভাবে উপস্থাপন করতে Nested Resources ব্যবহৃত হয়।
Nested Routes কী?
Nested Routes হলো সেই রাউটিং ব্যবস্থা যা আপনাকে URL-এ সম্পর্কিত রিসোর্সগুলোকে নেস্টেড (nested) করে পথ তৈরি করতে সাহায্য করে। এটি এমনভাবে কাজ করে যে, পিতামাতা রিসোর্সের URL এর মধ্যে সন্তান রিসোর্সের URL যুক্ত হয়।
উদাহরণ:
ধরা যাক, আমাদের একটি ব্লগ অ্যাপ্লিকেশন আছে, যেখানে প্রতিটি Post এর একাধিক Comment রয়েছে। আমরা চাই, Comment তৈরি করার জন্য URL-এর মধ্যে Post এর আইডি থাকতে হবে।
Routes এবং Nested Resources সংজ্ঞায়িত করা
Rails এ nested resources এর জন্য config/routes.rb ফাইলে রাউটিং কনফিগারেশন করতে হবে। চলুন, একটি উদাহরণ দেখি যেখানে Post এবং Comment রিসোর্সের জন্য নেস্টেড রাউটিং ব্যবহৃত হচ্ছে।
১. Nested Routes তৈরির জন্য Routes ফাইল
Rails.application.routes.draw do
resources :posts do
resources :comments
end
end
এখানে, resources :posts ব্যবহার করা হয়েছে, যার মধ্যে resources :comments নেস্টেড করা হয়েছে। এর ফলে, Comment রিসোর্সটি শুধুমাত্র একটি নির্দিষ্ট Post এর মধ্যে থাকবে।
২. জেনারেটর ব্যবহার
এটি সম্পাদন করতে আমরা rails generate কমান্ড ব্যবহার করে মডেল এবং কন্ট্রোলার তৈরি করতে পারি:
rails generate model Post title:string body:text
rails generate model Comment body:text post:references
rails generate controller Posts
rails generate controller Comments
এই কমান্ডগুলো দিয়ে যথাক্রমে Post এবং Comment মডেল এবং কন্ট্রোলার তৈরি হবে, যেখানে Comment মডেলটি Post মডেলের সাথে সম্পর্কিত থাকবে।
URL এবং HTTP রিকোয়েস্ট
নেস্টেড রাউট তৈরি করার ফলে URL এর কাঠামো পরিবর্তিত হবে এবং পিতামাতা রিসোর্সের আইডি পাঠানোর প্রয়োজন হবে। নীচে কিছু উদাহরণ দেখানো হলো:
- Posts রাউট:
GET /posts- সমস্ত পোস্টের তালিকা দেখানোর জন্যGET /posts/:id- একটি নির্দিষ্ট পোস্ট দেখানোর জন্য
- Comments রাউট (Nested):
GET /posts/:post_id/comments- নির্দিষ্ট পোস্টের সমস্ত মন্তব্য দেখানোর জন্যPOST /posts/:post_id/comments- নির্দিষ্ট পোস্টে নতুন মন্তব্য তৈরি করার জন্যGET /posts/:post_id/comments/:id- নির্দিষ্ট পোস্টের একটি মন্তব্য দেখানোর জন্য
এখানে post_id এর মাধ্যমে নির্দিষ্ট পোস্টের জন্য মন্তব্য করা হয়েছে।
Controller এর মধ্যে Nested Resources ব্যবহার
Rails কন্ট্রোলারেও নেস্টেড রিসোর্সের ব্যবহার করতে হবে। উদাহরণস্বরূপ, Posts এবং Comments কন্ট্রোলার এর মধ্যে সম্পর্ক তৈরি করতে হবে।
১. Posts Controller
class PostsController < ApplicationController
def show
@post = Post.find(params[:id])
end
end
২. Comments Controller
class CommentsController < ApplicationController
before_action :set_post
def create
@comment = @post.comments.new(comment_params)
if @comment.save
redirect_to post_path(@post), notice: 'Comment was successfully created.'
else
render :new
end
end
private
def set_post
@post = Post.find(params[:post_id])
end
def comment_params
params.require(:comment).permit(:body)
end
end
এখানে, CommentsController তে set_post মেথড ব্যবহার করে নির্দিষ্ট Post ইনস্ট্যান্স খোঁজা হচ্ছে এবং create মেথডে post_id প্যারামিটার দিয়ে মন্তব্য তৈরি করা হচ্ছে।
View Example
এখন, পোস্টের একটি মন্তব্য তৈরি করতে, আমরা নীচের মতো ভিউ ফাইল তৈরি করতে পারি:
১. Post Show View (show.html.erb)
<h1><%= @post.title %></h1>
<p><%= @post.body %></p>
<h2>Comments:</h2>
<%= form_with(model: [@post, @post.comments.new]) do |form| %>
<%= form.text_area :body %>
<%= form.submit "Add Comment" %>
<% end %>
<ul>
<% @post.comments.each do |comment| %>
<li><%= comment.body %></li>
<% end %>
</ul>
এখানে, form_with মেথডের মাধ্যমে আমরা একটি নতুন মন্তব্য তৈরি করতে @post এবং @post.comments.new ব্যবহার করেছি। এর ফলে, এই মন্তব্যটি সম্পর্কিত পোস্টের জন্য সংযুক্ত হবে।
Advantages of Nested Resources
- সংশ্লিষ্ট রিসোর্স গুলোর মধ্যে সম্পর্ক বজায় রাখা: Nested Resources সম্পর্কিত রিসোর্সগুলোর মধ্যে সম্পর্ক বজায় রাখে এবং এটির মাধ্যমে পিতামাতা-সন্তান সম্পর্ক (parent-child relationship) আরও পরিষ্কার হয়।
- URL গুলো আরো পাঠযোগ্য: নেস্টেড রাউটিং ব্যবহার করে, URL গুলো পরিষ্কার এবং নির্দিষ্ট রিসোর্সের সাথে সম্পর্কযুক্ত হয়ে থাকে, যেমন
posts/:post_id/comments. - কন্ট্রোলার এবং ভিউ এর সংগঠন: Nested Resources কন্ট্রোলার এবং ভিউ গুলোকে আরও সংগঠিত করে এবং রিলেটেড ফিচারগুলো একত্রে রাখে, যা কোডে আরও সহজলভ্যতা আনে।
সারমর্ম
Nested Resources এবং Nested Routes Rails অ্যাপ্লিকেশনে সম্পর্কিত রিসোর্সগুলোর মধ্যে যোগাযোগ সহজ করে এবং তাদের কাঠামোকে আরও পরিষ্কার করে তোলে। এটি রাউটিং, কন্ট্রোলার, এবং ভিউ স্তরে সম্পর্কিত রিসোর্সগুলোর মধ্যে সহযোগিতা বৃদ্ধি করে এবং URL গুলোকে আরও পাঠযোগ্য ও কার্যকরী করে তোলে।
Read more