আমি each
ভালোবাসি , কিন্তু আমার এটির সাথে একটি সমস্যা আছে। আপনার কাছে একটি খালি সংগ্রহ থাকলে কী হয়?
আপনি যদি [].each
কল করেন , কিছুই হবে না এবং []
ফেরত দেওয়া হবে। কখনও কখনও, আপনি যা চান তা। কিন্তু প্রায়শই, বিশেষ করে যখন আপনি UI তৈরি করছেন, আপনি খালি তালিকাগুলিকে একটি বিশেষ উপায়ে পরিচালনা করতে চাইবেন৷ উদাহরণস্বরূপ, যখন আমার কাছে কোনো ডেটা থাকে না তখন আমি সাধারণত একটি ভিন্ন বার্তা দেখাতে চাই৷
কিন্তু যেহেতু [].each
[]
ফেরত দেয় , nil
নয় , আপনি এইরকম কিছু লিখতে আটকে আছেন:
<% if @users.empty? -%>
<p>You don't have any users. <%= link_to "Add one!", new_user_path %></p>
<% else -%>
<% @users.each do |user| -%>
<p><%= user.name %></p>
<% end -%>
<% end -%>
যে কাজ করে, কিন্তু এটা বিশ্রী লাগে. আমি বরং বলব, "এই সংগ্রহের প্রতিটি আইটেমের সাথে এই জিনিসটি করুন, যদি না এতে কিছু না থাকে, সেক্ষেত্রে এই অন্য জিনিসটি সম্পূর্ণরূপে করুন।" আমি each
এর মত কিছু চাই , একটি "অথবা অন্য।" সহ
রেন্ডারিং রেল সংগ্রহ
আপনার মতামত ভিতরে, রেল সাহায্য করতে পারে. জিনিসগুলির সংগ্রহ রেন্ডার করার ক্ষেত্রে এটি দুর্দান্ত:
<%= render @users %>
<p><%= user.name %></p>
যখন render
পাস করা হয়েছে @users
, এটি _user.html.erb
রেন্ডার করে @users
-এর ভিতরে প্রতিটি ব্যবহারকারীর জন্য একবার . আপনি each
এড়িয়ে যেতে পারেন সম্পূর্ণরূপে।
বোনাস হিসাবে, যদি @users
খালি, render
nil
ফেরত দেয় , ঠিক যেমন আমরা চাই! সুতরাং আপনি এটি লিখতে পারেন, এবং মূল সংস্করণের মতো একই আউটপুট পেতে পারেন:
<%= render(@users) || render('empty') %>
<p><%= user.name %></p>
<p>You don't have any users. <%= link_to "Add one!", new_user_path %></p>
এটি অনেক বেশি সরাসরি, একবার আপনি রেলের কনভেনশনগুলি বুঝতে পারলে।
একটি দৃশ্যের বাইরে কী হবে?
আপনি যদি Rails অনুসরণ করেন, render
একটি সংগ্রহের সাথে বস্তুর সংগ্রহ রেন্ডার করার একটি দ্রুত, শক্তিশালী উপায়৷
কিন্তু কখনও কখনও আপনি প্রতিটি আইটেম রেন্ডার করার জন্য একটি অতিরিক্ত আংশিক মোকাবেলা করতে চান না। অথবা render
আপনার নকশা সমর্থন করবে না। অথবা আপনি একটি দৃশ্যের ভিতরেও থাকবেন না।
আমি এখন পর্যন্ত যে সেরা সমাধান পেয়েছি তা হল presence
.
list.presence
একই রকম:
if list.present?
list
else
nil
end
অর্থাৎ, তালিকাটিতে কিছু থাকলে আপনি সেটি ফিরে পাবেন এবং nil
যদি এটি খালি হয়।
presence
সহ , আপনি লিখতে পারেন:
@users.each do |user|
puts user.name
end.presence || puts("You don't have any users.")
এটি প্রতিটি নাম প্রিন্ট করে যদি @users
-এ ব্যবহারকারী থাকে , অথবা You don't have any users
অন্যথায়।
তবুও, আমি presence
ছাড়াই করতে পারতাম . এটি একটি হ্যাক মত মনে হয়, কারণ এটি একটি. যদি এটি সমর্থিত হয়, তাহলে এরকম কিছু ভালো হতে পারে:
@users.each do |user|
puts user.name
end || puts("You don't have any users.")
অথবা Smalltalk-ish:
@users.each(if_empty: lambda { puts "You don't have any users." }) do |user|
puts user.name
end
অথবা এমনকি (হাঁপাও!):
for user in @users
puts user.name
else
puts "You don't have any users."
end
আপাতত, যদিও, আমি সাধারণত শুধু presence
দিয়ে যাই অথবা মৌলিক if blank?; else each
প্যাটার্ন।
আপনি কোনটি ভাল মনে করেন? আপনি কিভাবে খালি তালিকা পরিচালনা করবেন? আপনি একটি ভাল উপায় খুঁজে পেয়েছেন? যদি তাই হয়, আমাকে এটা সম্পর্কে বলুন!