Tuần trước, trong RailsConf 2017, Rails 5.1 đã được xuất xưởng.
Nếu theo dõi các thông báo, bạn đã thấy các tính năng lớn:tích hợp tốt hơn với JavaScript hiện đại, bí mật được mã hóa và kiểm tra hệ thống. Và có mục yêu thích cá nhân của tôi: cuối cùng loại bỏ tổ hợp kỳ lạ của form_for
và form_tag
và thay thế nó bằng form_with
. Tôi nóng lòng muốn thử.
Nhưng lý do tôi yêu thích Rails không phải là các tính năng mới lớn. Đó là những cải tiến nhỏ, không ngừng. Chính những thay đổi về chất lượng cuộc sống đó khiến tôi hạnh phúc hơn khi viết ứng dụng Rails. Và Rails 5.1 có đầy đủ chúng.
Các trình trợ giúp thẻ nhất quán hơn
Bạn đã sử dụng các trình trợ giúp thẻ của Rails, như thẻ tag
chưa và content_tag
?
<%= content_tag :p, @user.name, class: "name" %>
Rails 5.1 thêm một cú pháp trình trợ giúp thẻ mới.
Sử dụng các lệnh gọi như tag.div
hoặc tag.br
và bạn có thể ngừng lo lắng về thứ tự tham số và kết hợp hai phương pháp khác nhau:
<%= tag.p @user.name, class: "name" %>
<%= tag.br %>
Những trình trợ giúp thẻ mới này hỗ trợ HTML5 theo mặc định và thậm chí cho phép bạn tạo các phần tử của riêng mình:
<%= tag.pea @user.name, class: "name" %>
<!-- turns into <pea class="name">Justin Weiss</pea> -->
Khẳng định nhiều hơn là chỉ sự khác biệt
Tôi thích assert_difference
. Trước assert_difference
, Tôi đã dành quá nhiều thời gian để sắp xếp các biến cục bộ trong các thử nghiệm:
old_score = @user.score
@user.answer_question!(...)
assert_equal old_score + 10, @user.score
Với assert_difference
, rõ ràng hơn nhiều về những gì bạn đang cố gắng làm:
assert_difference "@user.score", 10 do
@user.answer_question!(...)
end
Trong Rails 5.1, assert_changes
tiến thêm một bước nữa.
assert_difference
chỉ kiểm tra những thay đổi về số lượng. Nhưng assert_changes
có thể kiểm tra các thay đổi không phải số, chẳng hạn như các thay đổi giữa hai chuỗi hoặc giữa nil và một cái gì đó khác:
assert_changes "users(:justin).name", from: "Justin", to: "Bob" do
@user.update_attributes(name: "Bob")
end
Thay vì một chuỗi, bạn có thể cung cấp cho nó một lambda:
assert_changes -> { users(:justin).name }, from: "Justin", to: "Bob" do
@user.update_attributes(name: "Bob")
end
to:
có thể là bất kỳ thứ gì so sánh với ===. Thật tuyệt khi bạn biết điều gì đó về giá trị, nhưng không biết nó là gì, cụ thể:
assert_changes -> { users(:justin).updated_at }, to: ActiveSupport::TimeWithZone do
@user.update_attributes(name: "Bob")
end
Ủy quyền mọi thứ
Trong một số mã Rails, bạn sẽ thấy delegate
phương pháp được sử dụng. Ủy quyền rất hữu ích khi bạn muốn thêm hành vi lên trên một lớp khác mà không phải kế thừa từ nó:
class Player
delegate :id, :name, to: :@user
def initalize(user)
@user = user
end
def points
Game.points_for_user(user.id)
end
end
Nhưng đôi khi bạn muốn chuyển tiếp mọi thứ đến lớp học mà bạn đang kết thúc.
Có một số cách để thực hiện việc này với Ruby, sử dụng method_missing
hoặc SimpleDelegator
. Nhưng để đối sánh tốt hơn với delegate
phương thức, delegate_missing_to
đã được thêm vào Rails 5.1. Nó thực hiện chính xác những gì nó nói:
class Player
delegate_missing_to :@user
def initalize(user)
@user = user
end
def points
Game.points_for_user(user.id)
end
end
Bây giờ, bất kỳ lệnh gọi nào đến một phương thức không có trong lớp Player sẽ tìm kiếm trên @user
thay vào đó.
Phần thưởng:alias_method_chain
đã biến mất!
Một trong những tính năng yêu thích của tôi trong Ruby 2 là Module # prepend. Tôi thích nó rất nhiều, tôi đã viết một bài về nó. Cụ thể, về cách tôi hy vọng Mô-đun # prepend cuối cùng sẽ thay thế alias_method_chain
.
Và kể từ Rails 5.1, alias_method_chain
hiện đã chính thức biến mất - được thay thế bằng thêm trước.
Các phiên bản mới của Rails luôn thú vị. Nhưng đó là những chi tiết tạo nên vẻ đẹp của Rails. Những thay đổi nhỏ giúp bạn hạnh phúc hơn với mã bạn viết mỗi ngày.
Làm thế nào để bạn tìm thấy những thay đổi? Đi sâu vào các thay đổi. Hãy xem các yêu cầu kéo thú vị. Xem tính năng 5.1 mới, nhỏ nào sẽ giúp cuộc sống của bạn dễ dàng hơn một chút.
Và khi bạn tìm thấy một số nội dung thú vị, đừng giữ nó cho riêng mình. Chia sẻ nó ở đây để tất cả chúng ta có thể học được điều gì đó mới!