Những tính năng ít được biết đến trong rails 5.1
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 ...
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é!
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" %>
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
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.
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
https://www.justinweiss.com/articles/the-lesser-known-features-in-rails-5-dot-1/