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

Rails 5.1: ฟีเจอร์แฝงที่น่าสนใจ Tag Helpers, Assertions, Delegation

Rails 5.1 ปล่อยตอน RailsConf 2017 ฟีเจอร์ใหญ่: JS Integration, Encrypted Secrets, System Tests, form_with แทน form_for/form_tag แต่ ความสวยงามของ Rails อยู่ที่รายละเอียดเล็กๆ ที่ทำให้เขียนโค้ดวันละดีขึ้น

1. Tag Helpers ที่สอดคล้องกันมากขึ้น

เดิม: tag และ content_tag สับสน Parameter Order

<%= content_tag :p, @user.name, class: "name" %>

Rails 5.1: ใช้ tag.tagname โดยตรง

<%= tag.p @user.name, class: "name" %>
<%= tag.br %>


<%= tag.pea @user.name, class: "name" %>

✅ HTML5 Default, สร้าง Custom Element ได้, ไม่ต้องจด Parameter Order

2. assert_changes: ขยายจาก assert_difference

เดิม assert_difference เช็คเฉพาะตัวเลข (Count)

old_score = @user.score
@user.answer_question!(...)
assert_equal old_score + 10, @user.score

# กลายเป็น
assert_difference "@user.score", 10 do
  @user.answer_question!(...)
end

Rails 5.1: assert_changes เช็คการเปลี่ยนแปลง Non-Numerical ได้

# String Change
assert_changes "users(:justin).name", from: "Justin", to: "Bob" do
  @user.update_attributes(name: "Bob")
end

# Lambda Syntax
assert_changes -> { users(:justin).name }, from: "Justin", to: "Bob" do
  @user.update_attributes(name: "Bob")
end

# Flexible Matcher (===)
assert_changes -> { users(:justin).updated_at }, to: ActiveSupport::TimeWithZone do
  @user.update_attributes(name: "Bob")
end

3. delegate_missing_to: Forward ทุก Method

เดิม delegate ต้องระบุ Method ทีละตัว

class Player
  delegate :id, :name, to: :@user
  def initialize(user); @user = user; end
  def points; Game.points_for_user(user.id); end
end

Rails 5.1: delegate_missing_to Forward ทุก Method ที่ไม่มีใน Class นี้

class Player
  delegate_missing_to :@user
  def initialize(user); @user = user; end
  def points; Game.points_for_user(user.id); end
end

# Player.new(user).name  → เรียก user.name อัตโนมัติ

4. Bonus: alias_method_chain หายไปแล้ว!

Ruby 2 มี Module#prepend แทน alias_method_chain ได้

Rails 5.1: alias_method_chain ถูกลบออก อย่างเป็นทางการ ใช้ prepend แทน

หา Feature เหล่านี้อย่างไร?

  • อ่าน Changelogs
  • ดู Pull Requests ที่น่าสนใจ
  • ลองหา Feature ใหม่ๆ ที่ทำให้ชีวิตง่ายขึ้น

เจออะไรดีๆ อย่าเก็บตัว 來 แชร์ใน Comments ให้ทุกคนเรียนรู้ด้วย!