গত সপ্তাহে, রেইলসকনফ ২০১৭-এ, রেইলস ৫.১ রিলিজ হয়েছে।
আপনি যদি ঘোষণাগুলো ফলো করেছেন, তবে আপনি বড় ফিচারগুলো দেখেছেন: আধুনিক জাভাস্ক্রিপ্টের সাথে আরও ভালো ইন্টিগ্রেশন, এনক্রিপ্টেড সিক্রেটস, এবং সিস্টেম টেস্ট। এবং আমার ব্যক্তিগত পছন্দ: অবশেষে form_for এবং form_tag-এর उस 수상쩍ে কম্বো থেকে মুক্তি, এবং সেটিকে form_with দিয়ে রিপ্লেস করা। আমি চেষ্টা করতে অপেক্ষা করতে পারি না।
কিন্তু আমি রেইলসকে ভালোবাসার কারণ বড় নতুন ফিচারগুলো নয়। সেটি হল ছোট ছোট, ধারাবাহিক উন্নতিগুলো। সেটি হল কোয়ালিটি-অফ-লাইফ চেঞ্জগুলো যা রেইলস অ্যাপ লিখার সময় আমাকে খুশি করে। এবং রেইলস ৫.১ সেসব পূর্ণ।
আরও কনসিস্টেন্ট ট্যাগ হেল্পার
আপনি কি রেইলসের ট্যাগ হেল্পার ব্যবহার করেছেন, যেমন tag এবং content_tag?
<%= content_tag :p, @user.name, class: "name" %>
রেইলস ৫.১ একটি নতুন ট্যাগ হেল্পার সিনট্যাক্স যোগ করেছে।
tag.div বা tag.br এর মতো কল ব্যবহার করুন, এবং প্যারামিটার অর্ডার এবং দুটি আলাদা মেথড জাগল করার চিন্তা ছেড়ে দিন:
<%= tag.p @user.name, class: "name" %>
<%= tag.br %>
এই নতুন ট্যাগ হেল্পারগুলো ডিফল্টভাবে HTML5 সাপোর্ট করে, এবং আপনাকে আপনার নিজস্ব এলিমেন্ট তৈরি করতে দেয়:
<%= tag.pea @user.name, class: "name" %> <!-- turns into <pea class="name">Justin Weiss</pea> -->
শুধু ডিফারেন্স নয়, আরও কিছু অ্যাসার্ট করুন
আমি assert_difference পছন্দ করি। assert_difference-এর আগে, আমি অনেক বেশি সময় লোকাল ভেরিয়েবল জাগল করতে বিতন্দে করতাম টেস্টে:
old_score = @user.score
@user.answer_question!(...)
assert_equal old_score + 10, @user.score
assert_difference দিয়ে, এটি অনেক স্পষ্ট যে আপনি কী করতে চাচ্ছেন:
assert_difference "@user.score", 10 do
@user.answer_question!(...)
end
রেইলস ৫.১-এ, assert_changes এটি এক ধাপ আরও এগিয়ে নিয়ে যায়।
assert_difference শুধু কাউন্ট পরিবর্তন চেক করে। কিন্তু assert_changes নন-নিউমেরিক্যাল পরিবর্তন চেক করতে পারে, যেমন দুটি স্ট্রিংয়ের মধ্যে পরিবর্তন, অথবা nil এবং অন্য কিছুর মধ্যে:
assert_changes "users(:justin).name", from: "Justin", to: "Bob" do
@user.update_attributes(name: "Bob")
end
এক স্ট্রিংয়ের বদলে, আপনি এটিকে একটি ল্যাম্বদা দিতে পারেন:
assert_changes -> { users(:justin).name }, from: "Justin", to: "Bob" do
@user.update_attributes(name: "Bob")
end
to: যেকোনো কিছু হতে পারে যা === দিয়ে কমপেয়ার করা যায়। এটি সুবিধাজনক যখন আপনি কিছু জানেন ভ্যালু সম্পর্কে, কিন্তু স্পষ্টভাবে কী সেটি না জানেন:
assert_changes -> { users(:justin).updated_at }, to: ActiveSupport::TimeWithZone do
@user.update_attributes(name: "Bob")
end
সব কিছু ডেলিগেট করুন
কিছু রেইলস কোডে, আপনি delegate মেথড ব্যবহার করা দেখবেন। ডেলিগেশন সহায়ক যখন আপনি অন্য একটি ক্লাসের ওপর বিহেভিয়ার যোগ করতে চান, সেটি ইনহেরিট না করে:
class Player
delegate :id, :name, to: :@user
def initialize(user)
@user = user
end
def points
Game.points_for_user(user.id)
end
end
কিন্তু কখনও কখনও আপনি সব কিছু ফরওয়ার্ড করতে চান যে ক্লাসটি আপনি র্যাপ করছেন।
রুবিতে এটি করার কয়েকটি উপায় আছে, method_missing বা SimpleDelegator ব্যবহার করে। কিন্তু delegate মেথডের সাথে আরও ভালো মিলাতে, delegate_missing_to রেইলস ৫.১-এ যোগ করা হয়েছে। এটি সঠিকই যা বলে:
class Player
delegate_missing_to :@user
def initialize(user)
@user = user
end
def points
Game.points_for_user(user.id)
end
end
এখন, Player ক্লাসে না থাকা যেকোনো মেথড কল @user-এ সার্চ করবে।
বোনাস: alias_method_chain চলে গেলো!
রুবি ২-এ আমার পছন্দের ফিচারগুলো থেকে একটি হল Module#prepend। আমি এত পছন্দ করতাম, আমি এর ওপর একটি পোস্ট লিখেছিলাম। স্পেসিফিক্যালি, কীভাবে আমি আশা করতাম Module#prepend cuốiে alias_method_chain-কে রিপ্লেস করবে।
এবং রেইলস ৫.১-এ, alias_method_chain আফিসিয়ালি চলে গেছে – prepend দিয়ে রিপ্লেস করা হয়েছে।
রেইলসের নতুন ভার্সনগুলো সবসময় এক্সাইটিং। কিন্তু সেটি হল ডিটেইলগুলো যা রেইলসকে সুন্দর করে তোলে। ছোট ছোট পরিবর্তনগুলো যা প্রতিদিন আপনি যা কোড লিখেন সেটি সাথে আপনাকে আরও খুশি করে।
আপনি এই পরিবর্তনগুলো কীভাবে খুঁজে পাবেন? চেঞ্জলগে ডুব দিন। আকর্ষণীয় পুল রিকোয়েস্টগুলো দেখুন। দেখুন ৫.১-এ কোন ছোট, নতুন ফিচারগুলো আপনার জীবন একটু সহজ করবে।
এবং যখন আপনি কিছু কুল জিনিস খুঁজে পাবেন, সেটি নিজের पास রাখবেন না। এখানে শেয়ার করুন, যাতে আমরা সবাই কিছু নতুন শিখতে পারি!