पिछले हफ्ते, RailsConf 2017 के दौरान, Rails 5.1 जारी हुआ।
यदि आपने घोषणाओं का पालन किया है, तो आपने बड़ी विशेषताएं देखी हैं: आधुनिक JavaScript के साथ बेहतर एकीकरण, एन्क्रिप्टेड सीक्रेट्स, और सिस्टम टेस्ट। और मेरा व्यक्तिगत पसंदीदा: आखिरकार form_for और form_tag के अजीब कॉम्बो से छुटकारा मिलना, और इसे form_with से बदलना। मैं इसे आजमाने के लिए इंतजार नहीं कर सकता।
लेकिन मैं Rails से प्यार करने का कारण बड़ी नई विशेषताएं नहीं हैं। यह छोटे, निरंतर सुधार हैं। यह वे क्वालिटी-ऑफ-लाइफ बदलाव हैं जो मुझे Rails ऐप्स लिखते समय खुश करते हैं। और Rails 5.1 उनसे भरा हुआ है।
अधिक सुसंगत टैग हेल्पर्स
क्या आपने Rails के टैग हेल्पर्स का उपयोग किया है, जैसे tag और content_tag?
<%= content_tag :p, @user.name, class: "name" %>
Rails 5.1 एक नया टैग हेल्पर सिंटैक्स जोड़ता है।
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
Rails 5.1 में, 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
सब कुछ डेलीगेट करें
कुछ Rails कोड में, आप delegate मेथड का उपयोग देखेंगे। डेलीगेशन तब उपयोगी होता है जब आप किसी अन्य क्लास से विरासत लिए बिना उसके ऊपर व्यवहार जोड़ना चाहते हैं:
class Player
delegate :id, :name, to: :@user
def initialize(user)
@user = user
end
def points
Game.points_for_user(user.id)
end
end
लेकिन कभी-कभी आप उस क्लास को जिसे आप लपेट रहे हैं, सब कुछ फॉरवर्ड करना चाहते हैं।
Ruby में ऐसा करने के कुछ तरीके हैं, method_missing या SimpleDelegator का उपयोग करके। लेकिन delegate मेथड से बेहतर मिलान के लिए, delegate_missing_to को Rails 5.1 में जोड़ा गया था। यह वही करता है जो यह कहता है:
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 चला गया!
Ruby 2 में मेरी पसंदीदा विशेषताओं में से एक Module#prepend है। यह मुझे इतना पसंद आया कि मैंने इसके बारे में एक पोस्ट लिखा। विशेष रूप से, इस बारे में कि मुझे कैसे उम्मीद थी कि Module#prepend अंततः alias_method_chain को प्रतिस्थापित कर देगा।
और Rails 5.1 तक, alias_method_chain अब आधिकारिक तौर पर चला गया है - prepend से प्रतिस्थापित।
Rails के नए संस्करण हमेशा रोमांचक होते हैं। लेकिन यह विवरण हैं जो Rails को उसकी सुंदरता देते हैं। वे छोटे बदलाव जो आपको आपके द्वारा हर दिन लिखे जाने वाले कोड से थोड़ा अधिक खुश करते हैं।
आप उन बदलावों को कैसे ढूंढते हैं? चेंजलॉग्स में डाइव करें। दिलचस्प पुल रिक्वेस्ट्स पर एक नज़र डालें। देखें कि नई, छोटी, 5.1 सुविधाओं में से कौन सी आपके जीवन को थोड़ा आसान बनाएगी।
और जब आपको कुछ अच्छी चीजें मिलें, तो उन्हें अपने तक न रखें। उन्हें यहां शेयर करें, ताकि हम सभी कुछ नया सीख सकें!