Những tính năng ít được biết đến trong rails 5.1
Bài đăng này đã không được cập nhật trong 7 năm
Như chúng ta đã biết, rails 5.1 là phiên bản mới nhất của rails. Nếu bạn theo dõi các bài báo khác thì thường nói đến những tính năng lớn như: tích hợp tốt hơn với Javascript, encrypted secrets hay system tests. Và sự thay đổi lớn đó là thay thế form_for, form_tag thành form_with. Ngoài ra, Rails cũng không ngừng cải thiện và cung cấp những tính năng nhỏ khác, những thay đổi đó giúp bạn cảm thấy happy hơn khi lập trình. Cùng theo dõi bài viết này để biết những thay đổi thú vị đó nhé!
Những tag helpers thú vị hơn
Chắc hẳn bạn đã từng sử dụng những tag helpers như tag
và content_tag
trổng kiểu như này:
<%= content_tag :p, @user.name, class: "name" %>
Rails 5.1 có một chút thay đổi về cú pháp khiến bạn không còn phải quan tâm đến thứ tự của các tham số, nó sẽ đơn giản hơn nhiều như sau:
<%= tag.p @user.name, class: "name" %>
<%= tag.br %>
tag
là helper mới mặc định hỗ trợ HTML5, và thậm chị bạn có thể tạo riêng cho mình 1 element:
<%= tag.mytag @user.name, class: "name" %>
<!-- <mytag class="name">Justin Weiss</mytag> -->
Không chỉ còn là assert_difference
nó là một tính năng khá thú vị, trước khi biết đến nó, chúng ta phải sử dụng khá nhiều thời gian với các biến local:
old_score = @user.score
@user.answer_question!(...)
assert_equal old_score + 10, @user.score
Khi sử dụng assert_difference
, nó rõ ràng hơn những gì trước đó rất nhiều:
assert_difference "@user.score", 10 do
@user.answer_question!(...)
end
Trong rails 5.1 assert_changes
như một bước tiến xa hơn so với assert_difference
.
assert_difference
chỉ kiểm tra những thay đổi trong giữa các con số. Nhưng assert_change
không chỉ dừng lại ở đó, nó còn có thể kiểm tra thay đổi giữa 2 strings, giữa nil và các đối tượng khác:
assert_changes "users(:justin).name", from: "Justin", to: "Bob" do
@user.update_attributes(name: "Bob")
end
to:
có thể là bất cứ thứ gì được so sánh bởi ===
. Nó hữu ích khi bạn biết giá trị nhưng không biết rõ nó là cái gì, cụ thể:
assert_changes -> { users(:justin).updated_at }, to: ActiveSupport::TimeWithZone do
@user.update_attributes(name: "Bob")
end
Delegate everything
Ta rất hay sửa dụng từ khóa delegate
khi muốn thêm một hành vi vào 1 class khác mà không có quan hệ kế thừa với nói.
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 một class khác. Có một vài cách để thực hiện được như sử dụng method_missing
hoặc SimpleDelegator
. Nhưng để phù hợp hơn với delegate method, delegate_missing_to đã được thêm vào rails 5.1. Nó thực hiện chính xác như nghĩa của nó:
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 cứ phương thức nào được gọi không có trong class Player thì sẽ tìm kiếm trong biến @user
và một chút thay đổi khác trong rails 5.1 là alias_method_chain
đã bị thay thế bởi prepend
.
Kết luận
Phiên bản mới của Rails luôn luôn mang lại cho chúng ta những điều thú vị, nó làm nên vẻ đẹp của framework này. Một chút thay đổi nhỏ nó cũng khiến bạn cảm thấy hạnh phúc hơn với việc lập trình mỗi ngày. Khi bạn tìm thấy một số thứ thú vị, đừng giữ nó cho riêng mình. Hãy chia sẻ nó, để tất cả chúng ta đều có thể học được nhiều điều mới
Tham khảo
https://www.justinweiss.com/articles/the-lesser-known-features-in-rails-5-dot-1/
All rights reserved