Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

คุณสมบัติที่รู้จักกันน้อยใน Rails 5.1

สัปดาห์ที่แล้ว ระหว่าง 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 ใหม่ขนาดเล็กตัวใดที่จะทำให้ชีวิตของคุณง่ายขึ้นอีกนิด

และเมื่อเจอของเจ๋งๆ ก็อย่าเก็บไว้คนเดียว แชร์ที่นี่ เพื่อให้เราทุกคนได้เรียนรู้สิ่งใหม่!