Nested Forms এবং Multiple Model Forms একটি Ruby on Rails অ্যাপ্লিকেশনে একাধিক মডেলের তথ্য একটি একক ফর্মের মাধ্যমে জমা দেয়ার একটি অত্যন্ত কার্যকরী উপায়। এটি সাধারণত তখন ব্যবহৃত হয় যখন একাধিক মডেলের মধ্যে সম্পর্ক থাকে এবং আপনি একটি ফর্মের মাধ্যমে একাধিক মডেলের ডেটা সঞ্চয় করতে চান।
Rails-এ Nested Forms সাধারণত has_many বা belongs_to সম্পর্কের ক্ষেত্রে ব্যবহার করা হয়, যেখানে একটি মডেল একাধিক রেকর্ড সংরক্ষণ করতে পারে (যেমন: একটি পোস্টের অনেকগুলি মন্তব্য)।
Nested Forms কী?
Nested Forms এমন একটি ফিচার, যা আপনাকে একটি ফর্মের মধ্যে একাধিক মডেলের তথ্য সন্নিবেশ করতে সহায়তা করে। উদাহরণস্বরূপ, আপনি যদি User মডেল এবং তার সাথে সম্পর্কিত একাধিক Address মডেল নিয়ে কাজ করছেন, তাহলে আপনি একটি ফর্মে User এবং তার সাথে সম্পর্কিত Address একযোগে সন্নিবেশ করতে পারেন।
Nested Forms ব্যবহারের উপকারিতা
- সহজ ডেটা সন্নিবেশ: একাধিক সম্পর্কিত মডেল সহজেই একটি ফর্মের মাধ্যমে সন্নিবেশ করা যায়।
- একক HTTP রিকুয়েস্ট: একাধিক মডেলের জন্য আলাদা আলাদা ফর্ম বা HTTP রিকুয়েস্ট করার প্রয়োজন নেই।
- ডেটাবেসে সম্পর্কিত তথ্য সংরক্ষণ: একাধিক সম্পর্কিত মডেলকে একত্রে সন্নিবেশ করে ডেটাবেসে সম্পর্ক বজায় রাখা যায়।
Nested Form তৈরি করার জন্য প্রয়োজনীয় স্টেপস
ধরা যাক, আমাদের একটি User মডেল এবং তার সাথে সম্পর্কিত একাধিক Address মডেল রয়েছে। আমরা একটি ফর্মে User এবং তার Address সম্পর্কিত তথ্য একযোগে গ্রহণ করতে চাই।
ধাপ ১: মডেল সম্পর্ক স্থাপন
প্রথমে, দুইটি মডেলের মধ্যে সম্পর্ক তৈরি করতে হবে। উদাহরণস্বরূপ:
# user.rb
class User < ApplicationRecord
has_many :addresses
accepts_nested_attributes_for :addresses, allow_destroy: true
end
# address.rb
class Address < ApplicationRecord
belongs_to :user
end
এখানে, User মডেলটি has_many :addresses অ্যাসোসিয়েশন ব্যবহার করছে, এবং accepts_nested_attributes_for মেথডটি ব্যবহার করা হচ্ছে যাতে Address মডেলের জন্য নেস্টেড ফর্মের মাধ্যমে ডেটা ইনপুট করা যায়।
ধাপ ২: ফর্ম তৈরি করা
Rails এ nested form তৈরি করতে, আমরা form_for বা form_with ব্যবহার করি। fields_for মেথডের মাধ্যমে আমরা nested form তৈরি করি, যা addresses মডেলটি সংগ্রহ করবে।
<%= form_with model: @user do |f| %>
<%= f.text_field :name %>
<%= f.text_field :email %>
<%= f.fields_for :addresses do |a| %>
<%= a.text_field :street %>
<%= a.text_field :city %>
<% end %>
<%= f.submit %>
<% end %>
এখানে, fields_for ব্যবহার করে আমরা addresses মডেলের ইনপুট ফিল্ড তৈরি করেছি। @user একটি User অবজেক্ট এবং তার সাথে সম্পর্কিত addresses ডেটাও এই ফর্মে ইনপুট করা যাবে।
ধাপ ৩: কন্ট্রোলারে ইনপুট ডেটা প্রসেস করা
কন্ট্রোলারে user_params মেথডে addresses_attributes যোগ করতে হবে, যাতে User এবং Address মডেলগুলোর ডেটা সঠিকভাবে প্রসেস হয়:
class UsersController < ApplicationController
def new
@user = User.new
@user.addresses.build
end
def create
@user = User.new(user_params)
if @user.save
redirect_to @user
else
render :new
end
end
private
def user_params
params.require(:user).permit(:name, :email, addresses_attributes: [:street, :city, :id, :_destroy])
end
end
এখানে addresses_attributes: [:street, :city, :id, :_destroy] যোগ করা হয়েছে যাতে addresses সম্পর্কিত ডেটা সঠিকভাবে মডেলে প্রেরিত হয়। _destroy ফিল্ডটি ব্যবহৃত হয় কোন Address রেকর্ড মুছে ফেলতে।
ধাপ ৪: ভিউ (View)
Nested form ফর্মটি new.html.erb বা অন্য ভিউ ফাইলে তৈরি করা যেতে পারে:
<%= form_with model: @user do |f| %>
<%= f.text_field :name %>
<%= f.text_field :email %>
<%= f.fields_for :addresses do |a| %>
<%= a.text_field :street %>
<%= a.text_field :city %>
<%= a.check_box :_destroy %> Remove this address
<% end %>
<%= f.submit %>
<% end %>
এখানে fields_for এর মধ্যে street এবং city ইনপুট ফিল্ড যুক্ত হয়েছে এবং _destroy চেকবক্সের মাধ্যমে কোনো Address মুছে ফেলা যাবে।
Multiple Model Forms
Multiple Model Forms এমন ফর্ম যা একাধিক মডেলের ডেটা একত্রে সন্নিবেশ করতে ব্যবহৃত হয়। এটি সাধারণত তখন ব্যবহৃত হয় যখন একাধিক মডেল একটি সম্পর্কিত ফর্মের মাধ্যমে একযোগে সংরক্ষণ করতে হয়।
উদাহরণস্বরূপ, আপনি যদি একাধিক মডেল নিয়ে কাজ করেন, যেমন Order এবং Product মডেল, এবং আপনি চান যে একটি ফর্মে একাধিক পণ্য যোগ করতে পারবেন, তাহলে আপনাকে Multiple Model Form ব্যবহার করতে হবে।
উদাহরণ: Multiple Model Form
ধরা যাক, Order এবং তার সাথে সম্পর্কিত একাধিক Product মডেল রয়েছে। এই ক্ষেত্রে, আমরা একটি ফর্মে Order এবং তার Products সম্পর্কিত তথ্য গ্রহণ করতে পারি।
# order.rb
class Order < ApplicationRecord
has_many :products
accepts_nested_attributes_for :products
end
# product.rb
class Product < ApplicationRecord
belongs_to :order
end
কন্ট্রোলারে:
class OrdersController < ApplicationController
def new
@order = Order.new
@order.products.build
end
def create
@order = Order.new(order_params)
if @order.save
redirect_to @order
else
render :new
end
end
private
def order_params
params.require(:order).permit(:total_price, products_attributes: [:name, :price, :quantity])
end
end
ভিউ:
<%= form_with model: @order do |f| %>
<%= f.text_field :total_price %>
<%= f.fields_for :products do |p| %>
<%= p.text_field :name %>
<%= p.number_field :price %>
<%= p.number_field :quantity %>
<% end %>
<%= f.submit %>
<% end %>
এখানে, Order মডেলের total_price এবং তার সাথে সম্পর্কিত Products (যেমন পণ্যের নাম, দাম, পরিমাণ) একটি ফর্মে একযোগে ইনপুট করা যাবে।
সারমর্ম
Nested Forms এবং Multiple Model Forms Rails অ্যাপ্লিকেশনে একাধিক সম্পর্কিত মডেলের তথ্য একটি ফর্মের মাধ্যমে সন্নিবেশ করতে সহায়তা করে। Nested Forms ব্যবহার করে একাধিক সম্পর্কিত মডেলের ডেটা একত্রে সংরক্ষণ করা সহজ হয়, এবং Multiple Model Forms ব্যবহার করে একাধিক মডেলের ডেটা একই ফর্মে সন্নিবেশ করা সম্ভব হয়। Rails-এ accepts_nested_attributes_for এবং fields_for মেথডগুলো এই কাজগুলো খুব সহজে সম্পন্ন করতে সাহায্য করে।
Read more