สัปดาห์ที่แล้ว ระหว่าง 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
สามารถตรวจสอบการเปลี่ยนแปลงที่ไม่ใช่ตัวเลข เช่น การเปลี่ยนแปลงระหว่างสองสตริง หรือระหว่างศูนย์กับอย่างอื่น:
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 initalize(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 initalize(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
ได้หายไปอย่างเป็นทางการแล้ว – แทนที่ด้วยคำนำหน้า
Rails เวอร์ชันใหม่นั้นน่าตื่นเต้นอยู่เสมอ แต่รายละเอียดที่ทำให้ Rails สวยงาม การเปลี่ยนแปลงเล็กๆ น้อยๆ ที่ทำให้คุณมีความสุขกับโค้ดที่คุณเขียนทุกวัน
คุณจะค้นพบการเปลี่ยนแปลงเหล่านั้นได้อย่างไร? ดำดิ่งสู่บันทึกการเปลี่ยนแปลง ดูคำขอดึงที่น่าสนใจ ดูว่าฟีเจอร์ 5.1 ใหม่ขนาดเล็กตัวใดที่จะทำให้ชีวิตของคุณง่ายขึ้นอีกนิด
และเมื่อเจอของเจ๋งๆ ก็อย่าเก็บไว้คนเดียว แชร์ที่นี่ เพื่อให้เราทุกคนได้เรียนรู้สิ่งใหม่!