কম্পিউটার

রুবি অন রেল দেখুন প্যাটার্ন এবং অ্যান্টি-প্যাটার্ন

Ruby on Rails Patterns এবং Anti-Patterns সিরিজের তৃতীয় কিস্তিতে আবার স্বাগতম। পূর্ববর্তী পোস্টগুলিতে, আমরা সাধারণভাবে প্যাটার্ন এবং অ্যান্টি-প্যাটার্নের পাশাপাশি রেল মডেলগুলির সাথে সম্পর্কিত। এই পোস্টে, রেলের দৃষ্টিভঙ্গির সাথে সম্পর্কিত কিছু প্যাটার্ন এবং অ্যান্টি-প্যাটার্নের উপর যেতে যাচ্ছি।

রেলের দৃষ্টিভঙ্গি কখনও কখনও পুরোপুরি কাজ করতে পারে এবং দ্রুত হতে পারে, এবং অন্য সময়ে, সেগুলির সমস্ত ধরণের সমস্যা হতে পারে৷ আপনি কীভাবে আপনার মতামতগুলি পরিচালনা করেন সে সম্পর্কে আত্মবিশ্বাস বাড়াতে চান বা আপনি এই বিষয়ে আরও জানতে চান, তাহলে এই ব্লগ পোস্টটি হল আপনি. আসুন সরাসরি ভিতরে ডুব দেই।

আপনি সম্ভবত জানেন, রেল ফ্রেমওয়ার্ক কনফিগারেশনের উপর নিয়ম অনুসরণ করে। এবং যেহেতু মডেল-ভিউ-কন্ট্রোলার (MVC) প্যাটার্নে রেলগুলি বড়, তাই ভিউ কোডের ক্ষেত্রেও স্বতন্ত্রভাবে প্রযোজ্য। এর মধ্যে রয়েছে আপনার মার্কআপ (ERB বা স্লিম ফাইল), জাভাস্ক্রিপ্ট এবং CSS ফাইল। প্রথম নজরে, আপনি ভাবতে পারেন যে ভিউ স্তরটি বেশ সরল এবং সহজ, তবে মনে রাখবেন যে আজকাল, ভিউ স্তরে বসবাসকারী প্রযুক্তির মিশ্রণ রয়েছে৷

আমরা ভিউতে JavaScript, HTML এবং CSS ব্যবহার করি। এই তিনটি কোডের বিভ্রান্তি এবং অব্যবস্থাপনার দিকে নিয়ে যেতে পারে - যা বাস্তবায়নের দিকে পরিচালিত করে যা দীর্ঘমেয়াদে খুব বেশি অর্থবোধ করে না। সৌভাগ্যবশত, আজ আমরা রেল ভিউ স্তরের সাথে কিছু সাধারণ সমস্যা এবং সমাধান করতে যাচ্ছি৷

পাওয়ারলিফটিং ভিউ

এটি এমন একটি ভুল যা প্রায়শই ঘটবে না, কিন্তু যখন এটি হয়, তখন এটি হয়। কখনও কখনও, লোকেরা সরাসরি ভিউ-এর ভিতরে ডোমেন লজিক বা অনুসন্ধান করার প্রবণতা রাখে। এটি ভিউ লেয়ারটিকে ভারী-উত্তোলন বা পাওয়ারলিফটিং করতে বাধ্য করে। মজার বিষয় হল যে রেলগুলি আসলে এটি সহজেই ঘটতে দেয়৷ যখন এটি আসে তখন কোনও 'নিরাপত্তা জাল' নেই, আপনি ভিউ লেয়ারে যা চান তা করার অনুমতি দেওয়া হয়৷

সংজ্ঞা অনুসারে, MVC প্যাটার্নের ভিউ লেয়ারে প্রেজেন্টেশনলজিক থাকা উচিত। এটি ডোমেন লজিক বা অনুসন্ধানের ডেটা নিয়ে বিরক্ত করা উচিত নয়। রেলে, আপনি ERB ফাইল (এম্বেডেড রুবি) পান যা আপনাকে রুবি কোড লিখতে দেয় যা তারপরে HTML এ মূল্যায়ন করা হবে। যদি আমরা সূচী পৃষ্ঠায় গান তালিকাভুক্ত একটি ওয়েব সাইটের উদাহরণ বিবেচনা করি, তাহলে app/views/songs/index.html.erb-এ ভিউ লজিক হবে। .

"পাওয়ারলিফটিং" বলতে কী বোঝায় এবং কী করা উচিত নয় তা বোঝাতে, আসুন নিম্নলিখিত উদাহরণটি দেখি:

# app/views/songs/index.html.erb
 
<div class="songs">
  <% Song.where(published: true).order(:title) do |song| %>
    <section id="song_<%= song.id %>">
      <span><%= song.title %></span>
 
      <span><%= song.description %></span>
 
      <a href="<%= song.download_url %>">Download</a>
    </section>
  <% end %>
</div>

এখানে একটি বিশাল অ্যান্টি-প্যাটার্ন হল মার্কআপে গানগুলি আনা। ডেটা আনার দায়িত্ব নিয়ন্ত্রকের কাছে অর্পণ করা উচিত বা নিয়ামক থেকে কল করা হচ্ছে এমন পরিষেবা। আমি মাঝে মাঝে দেখি মানুষ কন্ট্রোলারে কিছু ডেটা প্রস্তুত করে এবং পরে ভিউতে আরও ডেটা আনে। এটি খারাপ ডিজাইন এবং এটি আপনার ওয়েবসাইটকে ধীর করে তোলে কারণ আপনি আপনার ডেটাবেসকে প্রায়শই প্রশ্নগুলির সাথে চাপ দিচ্ছেন৷

পরিবর্তে আপনার যা করা উচিত তা হল একটি @songs প্রকাশ করা কন্ট্রোলার অ্যাকশন থেকে ইনস্ট্যান্স ভেরিয়েবল এবং মার্কআপে কল করুন, যেমন:

class SongsController < ApplicationController
  ...
 
  def index
    @songs = Song.all.where(published: true).order(:title)
  end
 
  ...
end
# app/views/songs/index.html.erb
 
<div class="songs">
  <% @songs.each do |song| %>
    <section id="song_<%= song.id %>">
      <span><%= song.title %></span>
 
      <span><%= song.description %></span>
 
      <a href="<%= song.download_url %>">Download</a>
    </section>
  <% end %>
</div>

এই উদাহরণ নিখুঁত থেকে অনেক দূরে. আপনি যদি আপনার কন্ট্রোলার কোডকে আরও পঠনযোগ্য রাখতে চান এবং SQL পাস্তা এড়াতে চান, আমি আপনাকে আগের ব্লগ পোস্টটি চেক করার জন্য অনুরোধ করছি। এছাড়াও, ভিউ লেয়ারে লজিক বাদ দিলে অন্য লোকেরা এটি থেকে তাদের সমাধান তৈরি করার চেষ্টা করবে এমন সম্ভাবনা বাড়িয়ে দেয়।

রেল আপনাকে যা দেয় তা ব্যবহার করুন

আমরা এখানে সংক্ষিপ্ত রাখব। রুবি অন রেল একটি ফ্রেমওয়ার্ক হিসাবে প্রচুর পরিপাটি সাহায্যকারীর সাথে আসে, বিশেষ করে ভিউয়ের ভিতরে। এই নিফটি সামান্য সাহায্যকারী আপনাকে দ্রুত এবং অনায়াসে আপনার ভিউ লেয়ার তৈরি করতে দেয়। Rails-এর একজন শিক্ষানবিস ব্যবহারকারী হিসেবে, আপনি আপনার ERb ফাইলের ভিতরে সম্পূর্ণ HTML লিখতে প্রলুব্ধ হতে পারেন:

# app/views/songs/new.html.erb
 
<form action="/songs" method="post">
  <div class="field">
    <label for="song_title">Title</label>
    <input type="text" name="song[title]" id="song_title">
  </div>
 
  <div class="field">
    <label for="song_description">Description</label>
    <textarea name="song[description]" id="song_description"></textarea>
  </div>
 
  <div class="field">
    <label for="song_download_url">Download URL</label>
    <textarea name="song[download_url]" id="song_download_url"></textarea>
  </div>
 
  <input type="submit" name="commit" value="Create Song">
</form>

এই এইচটিএমএল-এর সাহায্যে, নিচের স্ক্রিনশটে দেখানো একটি নতুন গানের জন্য আপনার একটি সুন্দর ফর্ম পাওয়া উচিত:

কিন্তু, Rails এর সাথে, আপনার দরকার নেই এবং আপনার এমন প্লেইন HTML লেখা উচিত নয় যেহেতু Rails এর সাথে আপনার পিঠ আছে। আপনি form_with ব্যবহার করতে পারেন সাহায্যকারী দেখুন যা আপনার জন্য HTML তৈরি করবে। form_with Rails 5.1-এ চালু করা হয়েছিল এবং সেখানে form_tag প্রতিস্থাপন করা হয়েছে এবং form_for যে কারো পরিচিত হতে পারে. চলুন দেখি কিভাবে form_with অতিরিক্ত কোড লেখা থেকে আমাদের মুক্তি দিতে পারে:

<%= form_with(model: song, local: true) do |form| %>
  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>
 
  <div class="field">
    <%= form.label :description %>
    <%= form.text_area :description %>
  </div>
 
  <div class="field">
    <%= form.label :download_url do %>
      Download URL
    <% end %>
    <%= form.text_area :download_url %>
  </div>
 
  <%= form.submit %>
<% end %>

আমাদের জন্য HTML তৈরি করার পাশাপাশি, form_with এছাড়াও একটি সত্যতা টোকেন তৈরি করে যা CSRF আক্রমণ প্রতিরোধ করে। তাই প্রায় সব ক্ষেত্রে, আপনি মনোনীত সাহায্যকারীদের অপব্যবহার করতে পারেন কারণ তারা রেল কাঠামোর সাথে ভাল খেলতে পারে৷ আপনি যদি একটি সাধারণ HTML ফর্ম জমা দেওয়ার চেষ্টা করেন তবে এটি ব্যর্থ হবে কারণ অনুরোধের সাথে জমা দেওয়া বৈধ সত্যতা টোকেন ছিল৷

এছাড়া form_with , label , text_area , এবং submit হেল্পার, এই ভিউ হেল্পারদের মধ্যে আরও অনেক বেশি আছে যারা রেলের সাথে বাক্সের বাইরে চলে আসে। এগুলি আপনার জীবনকে সহজ করার জন্য রয়েছে এবং আপনার তাদের আরও ভালভাবে জানা উচিত। "অল-স্টার" এর মধ্যে একটি অবশ্যই link_to৷ :

<%= link_to "Songs", songs_path %>

যা নিম্নলিখিত HTML তৈরি করবে:

<a href="/songs">Songs</a>

আমি প্রতিটি সাহায্যকারীর সম্পর্কে খুব বেশি বিস্তারিতভাবে যাব না, যেহেতু এই পোস্টটি টুলং হবে এবং সেগুলির মধ্যে দিয়ে যাওয়া আজকের বিষয়ের অংশ নয়৷ আমি আপনাকে রেইলস অ্যাকশন ভিউ সহায়িকাদের গাইড করার পরামর্শ দিচ্ছি এবং আপনার ওয়েবসাইটের জন্য আপনার যা প্রয়োজন তা বেছে নিন৷

ভিউ কোড পুনঃব্যবহার এবং সংগঠিত করা

এর নিখুঁত ওয়েব অ্যাপ্লিকেশন কল্পনা করা যাক. নিখুঁত ব্যবহারের ক্ষেত্রে, কোনো if-else স্টেটমেন্ট নেই, শুধুমাত্র বিশুদ্ধ কোড যা কন্ট্রোলার থেকে ডেটা নেয় এবং HTML ট্যাগের মধ্যে রাখে। হ্যাকাথনস এবং স্বপ্নে এই ধরনের অ্যাপ্লিকেশন বিদ্যমান থাকতে পারে, কিন্তু বাস্তব-বিশ্বের অ্যাপ্লিকেশনের ভিউ রেন্ডার করার সময় অনেকগুলি শাখা এবং শর্ত থাকে৷

একটি পৃষ্ঠার অংশগুলি দেখানোর জন্য যুক্তি খুব জটিল হয়ে গেলে আপনার কী করা উচিত? আপনি সেখান থেকে কোথায় যাবেন? একটি সাধারণ উত্তর হতে পারে একটি আধুনিক জাভাস্ক্রিপ্ট লাইব্রেরি বা ফ্রেমওয়ার্কের কাছে পৌঁছানো এবং জটিল কিছু তৈরি করা। কিন্তু, যেহেতু এই পোস্টটি Rails Views সম্পর্কে, তাই আসুন আমরা সেগুলোর ভিতরে থাকা বিকল্পগুলো দেখি।

আফটার-মার্কেট (কাস্টম) সাহায্যকারী

ধরা যাক আপনি একটি গানের নীচে একটি কল-টু-অ্যাকশন (CTA) বোতাম দেখাতে চান৷ কিন্তু, একটি ধরা আছে — একটি গানের ডাউনলোড URL থাকতে পারে বা, যে কারণেই হোক না কেন, এটি অনুপস্থিত হতে পারে। আমরা নিম্নলিখিত অনুরূপ কিছু কোড প্রলুব্ধ হতে পারে:

app/views/songs/show.html.erb
 
...
 
<div class="song-cta">
  <% if @song.download_url %>
    <%= link_to "Download", download_url %>
  <% else %>
    <%= link_to "Subscribe to artists updates",
                artist_updates_path(@song.artist) %>
  <% end %>
</div>
 
...

আমরা যদি উপরের উদাহরণটিকে একটি বিচ্ছিন্ন উপস্থাপনামূলক যুক্তি হিসাবে দেখি তবে এটি খুব খারাপ দেখায় না, তাই না? কিন্তু, যদি এই শর্তসাপেক্ষ রেন্ডারের বেশি থাকে, তাহলে কোডটি কম পঠনযোগ্য হয়ে ওঠে। এটি কিছু হওয়ার সম্ভাবনাও বাড়িয়ে দেয়, কোথাও সঠিকভাবে রেন্ডার হচ্ছে না, বিশেষ করে যদি আরও শর্ত থাকে।

এগুলির সাথে লড়াই করার একটি উপায় হল এগুলিকে আলাদা সাহায্যকারীর কাছে নেওয়া। সৌভাগ্যবশত, Rails আমাদের সহজে কাস্টম হেল্পার লেখার একটি উপায় প্রদান করে। app/helpers-এ আমরা একটি SongsHelper তৈরি করতে পারি , যেমন:

module SongsHelper
  def song_cta_link
    content_tag(:div, class: 'song-cta') do
      if @song.download_url
        link_to "Download", @song.download_url
      else
        link_to "Subscribe to artists updates",
                artist_updates_path(@song.artist)
      end
    end
  end
end

আমরা যদি একটি গানের শো পৃষ্ঠা খুলি, আমরা এখনও একই ফলাফল পাব৷ যাইহোক, আমরা এই উদাহরণটিকে আরও ভাল করতে পারি৷ উপরের উদাহরণে, আমরা aninstance ভেরিয়েবল @song ব্যবহার করেছি . আমরা যদি @song এমন জায়গায় এই হেল্পার ব্যবহার করার সিদ্ধান্ত নিয়ে থাকি তাহলে এটি উপলব্ধ নাও হতে পারে হল nil . তাই একটি ইন্সট্যান্স ভেরিয়েবলের আকারে একটি বাহ্যিক নির্ভরতা কেটে ফেলার জন্য, আমরা সাহায্যকারীর কাছে একটি যুক্তি দিতে পারি:

module SongsHelper
  def song_cta_link(song)
    content_tag(:div, class: 'song-cta') do
      if song.download_url
        link_to "Download", song.download_url
      else
        link_to "Subscribe to artists updates",
                artist_updates_path(song.artist)
      end
    end
  end
end

তারপর, দৃশ্যে, আমরা নীচের মত সাহায্যকারীকে কল করতে পারি:

app/views/songs/show.html.erb
 
...
 
<%= song_cta_link(@song) %>
 
...

এর সাথে, আমরা আগের মতোই ভিউতে একই ফলাফল পেতে পারি। সাহায্যকারী ব্যবহার করার বিষয়ে ভাল জিনিস হল যে আপনি তাদের জন্য পরীক্ষা লিখতে পারেন তা নিশ্চিত করে যে ভবিষ্যতে তাদের সম্পর্কে কোন অবহেলা ঘটবে। একটি সমস্যা হল যে সেগুলি বিশ্বব্যাপী সংজ্ঞায়িত করা হয়েছে এবং আপনাকে নিশ্চিত করতে হবে যে সাহায্যকারীর নামগুলি আপনার অ্যাপ জুড়ে অনন্য।

আপনি যদি Rails কাস্টম হেল্পার লেখার বড় অনুরাগী না হন, তাহলে আপনি সর্বদা ড্রেপার রত্ন দিয়ে একটি ভিউ মডেল প্যাটার্ন বেছে নিতে পারেন৷ অথবা আপনি এখানে আপনার নিজস্ব ভিউ মডেল প্যাটার্ন রোল করতে পারেন, এটি এতটা জটিল হওয়া উচিত নয়৷ আপনি যদি সবেমাত্র আপনার ওয়েব অ্যাপ দিয়ে শুরু করেন, তবে আমি কাস্টম হেল্পার লিখে ধীরে ধীরে শুরু করার পরামর্শ দিচ্ছি এবং যদি এটি ব্যথা নিয়ে আসে তবে অন্য সমাধানগুলিতে যান৷

আপনার ভিউ শুকিয়ে নিন

যখন আমি Rails দিয়ে শুরু করেছিলাম তখন আমি যা পছন্দ করেছিলাম তা হল আপনার মার্কআপকে সহজেই শুকানোর ক্ষমতা যা আমার কাছে প্রায় অবিশ্বাস্য ছিল। রেলগুলি আপনাকে আংশিক তৈরি করার ক্ষমতা দেয় — পুনরায় ব্যবহারযোগ্য কোড টুকরা যা আপনি যে কোনও জায়গায় অন্তর্ভুক্ত করতে পারেন। উদাহরণস্বরূপ, আপনি যদি একাধিক জায়গায় গান রেন্ডার করছেন এবং একাধিক ফাইল জুড়ে আপনার একই কোড থাকে, তাহলে একটি গান আংশিক তৈরি করা অর্থপূর্ণ৷

ধরা যাক আপনি নিচের মত করে আপনার গান দেখান:

# app/views/songs/show.html.erb
 
<p id="notice"><%= notice %></p>
 
<p>
  <strong>Title:</strong>
  <%= @song.title %>
</p>
 
<p>
  <strong>Description:</strong>
  <%= @song.description %>
</p>
 
<%= song_cta_link %>
 
<%= link_to 'Edit', edit_song_path(@song) %> |
<%= link_to 'Back', songs_path %>

কিন্তু, আপনি একই মার্কআপ সহ অন্য পৃষ্ঠায় এটি দেখাতে চান। তারপর আপনি app/views/songs/_song.html.erb এর মতো একটি আন্ডারস্কোর উপসর্গ সহ একটি নতুন ফাইল তৈরি করতে পারেন .

# app/views/songs/_song.html.erb
 
<p>
  <strong>Title:</strong>
  <%= @song.title %>
</p>
 
<p>
  <strong>Description:</strong>
  <%= @song.description %>
</p>
 
<%= song_cta_link(@song) %>

এবং তারপর যেখানেই আপনি গানটি আংশিক অন্তর্ভুক্ত করতে চান, আপনি কেবল নিম্নলিখিতগুলি করবেন:

...
 
<%= render "song" %>
 
...

রেলগুলি _song কিনা তা স্বয়ংক্রিয়ভাবে সন্ধান করবে আংশিক বিদ্যমান এবং এটি এটি রেন্ডার করবে। কাস্টম হেল্পারদের উদাহরণের মতো, আমরা যদি ইনস্ট্যান্স ভেরিয়েবল @song থেকে পরিত্রাণ পাই তাহলে সবচেয়ে ভালো হয় আমাদের আংশিক।

 
# app/views/songs/_song.html.erb
<p>
  <strong>Title:</strong>
  <%= song.title %>
</p>
 
<p>
  <strong>Description:</strong>
  <%= song.description %>
</p>
 
<%= song_cta_link(song) %>

তারপর, আমাদের গানের ভেরিয়েবলটিকে আংশিকভাবে পাস করতে হবে, এটিকে আরও পুনঃব্যবহারযোগ্য এবং অন্যান্য জায়গায় অন্তর্ভুক্ত করার জন্য উপযুক্ত করে তুলতে হবে।

...
 
<%= render "song", song: @song %>
 
...

চূড়ান্ত চিন্তা

যে এই পোস্টের জন্য সব লোকেরা. সংক্ষেপে বলতে গেলে, আমরা কয়েকটি প্যাটার্ন এবং অ্যান্টি-প্যাটার্নের মধ্য দিয়ে গিয়েছি যেগুলি আপনি রেল ভিউ রাজ্যে দেখতে পাবেন। এখানে কয়েকটি গ্রহণ করা হল:

  • UI-তে জটিল যুক্তি এড়িয়ে চলুন (ভিউকে প্রচুর পাওয়ারলিফটিং করতে বাধ্য করবেন না)
  • দেখুন সাহায্যকারীর পরিপ্রেক্ষিতে রেল আপনাকে কী দেয় তা জানুন৷
  • কাস্টম হেল্পার এবং আংশিকদের সাথে আপনার কোড গঠন ও পুনরায় ব্যবহার করুন
  • উদাহরণ ভেরিয়েবলের উপর খুব বেশি নির্ভর করবেন না।

পরবর্তী পোস্টে, আমরা রেল কন্ট্রোলার প্যাটার্ন এবং অ্যান্টি-প্যাটার্ন কভার করব যেখানে জিনিসগুলি বেশ অগোছালো হতে পারে। এর জন্য সাথে থাকুন।

পরেরটা পর্যন্ত, চিয়ার্স!

পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্ট মিস করবেন না!


  1. রুবি নিউজ ব্রিফ (Q2 2021)

  2. রেল অন রুবি মধ্যে ভারা কি?

  3. রেলে রুবিতে কীভাবে স্কোপ ব্যবহার করবেন

  4. রেলে রুবি কি এবং কেন এটি দরকারী?