Computer >> Máy Tính >  >> Lập trình >> Ruby

Các tính năng ít được biết đến trong Rails 5.1

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_forform_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!