চলুন রেইলস প্যারামিটার্স নিয়ে কথা বলি!
এগুলো কেন উপকারী?
ইউজাররা তিন ভিন্ন পথে আপনার ওয়েব অ্যাপ্লিকেশনে ডেটা পাঠাতে পারেন।
এ তিনটি পথ হলো:
- কোয়েরি প্যারামিটার ব্যবহার করে (
"example.com/?q=bacon") - একটি ফর্ম সাবমিট করে (
"/users/sign_in") - URL-র ভিতরে (
"/books/1")
রেইলস থেকে এই ডেটা কীভাবে অ্যাক্সেস করবেন?
params দিয়ে।
আপনার কন্ট্রোলার অ্যাকশনের ভিতরে আপনি params কল করে ফর্ম এবং URL কোয়েরি ডেটা এক্সেস করতে পারেন।
params কী, একদম?
এটি একটি মেথড যা একটি ActionController::Parameters অবজেক্ট রিটার্ন করে, প্র্যাক্টিক্যালি এটি একটি হ্যাশের মত behave করে।
এখন।
মান লিন আপনি এই params হ্যাশ থেকে একটি ভ্যালু পড়তে চান।
এভাবে:
params[:id]
ভ্যালুটি পাবেন যদি এক্সিস্ট করে।
অথবা nil যদি না করে।
কয়েকটি জিনিস জানা দরকার:
- যদি একটি ফিল্ড খালি রয়েয়ে যায় আপনি একটি খালি স্ট্রিং পাবেন
paramsএর ভিতরের সব ভ্যালু স্ট্রিং। এমনকি যদি সেগুলো ইন্টিজার হিসেবে সাবমিট করা হয়
চলুন রেইলস params-এ একটু গভীরে দেখি কারণ আপনি যদি এগুলো ভালোভাবে বুঝতে না পারেন তবে এগুলো বিভ্রান্তি এবং অদ্ভুত সমস্যার সোর্স হতে পারে!
রেইলস কনভেনশন: ফর্ম ফিল্ডস এবং Params
ফর্ম ফিল্ডস এবং URL প্যারামিটার params কিগুলোর সাথে কীভাবে ম্যাপ হয়?
আমার কাছে একটি উদাহরণ রয়েছে।
এখানে:
এটি একটি সিম্পল সার্চ ফর্ম যা /search-এ একটি POST রিকোয়েস্ট পাঠাবে।
ফলস্বরূপ, আপনি এই params অবজেক্ট পাবেন:
{ "q"=>"", "controller"=>"books", "action"=>"search" }
"q" কী?
এটি HTML ফর্মের ইনপুট ফিল্ডের name attribute।
নেমটি আপনার ইচ্ছামতো কিছু হতে পারে।
আপনি যদি form_for হেল্পার মেথড ব্যবহার করে আপনার ফর্ম তৈরি করেন, তবে নামগুলো অটো-জেনারেট হয় এবং সেগুলো একটি নির্দিষ্ট প্যাটার্ন ফলো করে।
এখানে একটি উদাহরণ:
# form_for(@book) with a few fields generates something like this
ফিল্ড নামগুলোর এই book[title] ফরম্যাট params হ্যাশ জেনারেট করবে যেখানে ভ্যালুগুলো নেস্টেড থাকবে।
উদাহরণ দিয়ে ব্যাখ্যা করছি:
{
"book"=> {
"title"=>"",
"author"=>"",
"cover"=>"",
"language"=>"English"
}
}
ইউজার একটি খালি ফর্ম সাবমিট করে এবং আপনি এটা পান।
আপনার কন্ট্রোলার থেকে…
আপনি ডেটা এইভাবে এক্সেস করবেন:
params[:book][:language] # "English" params[:book][:author] # ""
মনে রাখবেন যে এটি হ্যাশের মত behave করে, কিন্তু একটি রেগুলার হ্যাশের বিপরীতে, এটি সিম্বল এবং স্ট্রিং দুটোই সমান কি হিসেবে এক্সেপ্ট করবে।
অর্থাৎ params["book"] এবং params[:book] একই।
আপনার রুটগুলোর প্যারামিটার এক্সেপ্ট করার জন্য সক্ষম করা
কোয়েরি প্যারামিটারের বাহিরে, আপনি REST-স্টাইল প্যারামিটারও ইনেবল করতে পারেন।
রেইলসে, আমরা এটাকে একটি "ডাইনামিক সেগমেন্ট" বলি।
একটি উদাহরণ দেখা যাক।
আপনার কাছে যদি এমন একটি রুট থাকে:
get 'books/:id', to: 'books#show'
অথবা:
resources :books
আপনি এইরকম URL ব্যবহার করতে পারবেন:
/books/1
তারপর আপনি এই 1 কে এক্সেস করতে পারেন, যা books/:id-এ id।
params দিয়ে।
এভাবে:
params[:id]
এটি আপনাকে ইউজার যা খুঁজছেন সেটি স্পেসিফিক রিসোর্স খুঁজে বের করতে সাহায্য করবে।
Book.find(params[:id])
Strong Params বুঝা
এগিয়ে যাই:
আপনি যদি একটি অবজেক্ট ডেটাবেসে সংরক্ষণ করার চেষ্টা করেন, কিন্তু সেটি কাজ করার মত না লাগে।
আপনার রেইলস সার্ভার লগ দেখুন।
আপনি এইরকম কিছু দেখতে পারেন:
Unpermitted parameter: :language
এটি কী মানে?
রেইলস "strong parameters" সিস্টেম পরিচয় করিয়েছে, রেইলস ৪-এ একটি সিকিউরিটি ফিচার হিসেবে।
এটি আপনাকে বাধ্য করে অ্যাট্রিবিউটগুলো হোয়াইটলিস্ট করা যেগুলো সংরক্ষিত হতে পারে।
এটি "mass assignment" নামে পরিচিত একটি ইস্যু প্রিভেন্ট করে, যা ম্যালিশাস ইউজারদের admin = true সেট করতে দেয়, বা অন্য ফিল্ড সেট করতে দেয় যেগুলো সাধারণত তাদের অ্যাক্সেসের বাইরে থাকবে।
আপনি ফিল্ডগুলো এইভাবে হোয়াইটলিস্ট করতে পারেন:
def book_params params.require(:book).permit(:title, :author, :cover, :language) end
এটি কীভাবে কাজ করে?
requireমেথডparams[:book]খুঁজে বের করবে এবং সেটি না থাকলে এরর রেইজ করবে।permitমেথড হলো অ্যালোড (বাট অপশনাল) অ্যাট্রিবিউটের একটি লিস্ট।
ফলস্বরূপ, আপনি একটি নতুন params হ্যাশ পাবেন এই অ্যাট্রিবিউটসহ, কিন্তু এখন সেগুলো ডেটাবেসে সংরক্ষণ করার জন্য ক্লিয়ার।
উদাহরণ:
Book.create(book_params)
লক্ষ্য করুন যে একটি রেগুলার রুবি হ্যাশ এই সিকিউরিটি সিস্টেম বাইপাস করবে।
উদাহরণ:
Book.create(title: "", author: "", cover: "")
এটি ঠিক থাকা উচিত যদি অ্যাট্রিবিউট নামগুলো (যেমন author) হার্ডকোডেড থাকে।
সারসংক্ষেপ
আপনি রেইলস প্যারামিটার্স, কীভাবে সেগুলো কাজ করে এবং কীভাবে সেগুলো সঠিকভাবে আপনার রেইলস প্রজেক্টে ব্যবহার করবেন সেটি শিখেছেন!
এখন আপনার পালা প্র্যাক্টিস করার, নোট নেওয়ার, রিভিউ করার 🙂
পড়ার জন্য ধন্যবাদ।