+3

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 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ư tagcontent_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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí