+9

Một số method cần lưu ý đối với lập trình viên Ruby on Rails

1. Sử dụng blank?/present?

# String
name = nil
name.blank? # => true
name = ""
name.blank? # => true
name = " "
name.blank? # => true
name = "Tom"
name.blank? # => false

# Array
numbers = nil
numbers.blank? # => true
numbers = []
numbers.blank? # => true
numbers = [1, 2, 3]
numbers.blank? # => false

# Hash
params = nil
params.blank? # => true
params = {}
params.blank? # => true
params = { name: "Tom", email: "hoge@hoge.com" }
params.blank? # => false

present? thì ngược lại với blank?

# String
name = ""
name.present? # => false
name = "Tom"
name.present? # => true

2.Sử dụng presence

if user.name.blank?
  name = "What's your name?"
else
  name = user.name
end

name = user.name.presence || "What's your name?" "".presence hoặc [].presence sẽ trả về nil.

name = ""
puts name.presence || "What's your name?" # => What's your name?

3.Khi kiểm tra sự tồn tại của 1 string thì nên dùng blank? thay vì nil?

Mệnh đề “string không có giá trị” thường không cần phân biệt nil và "". Khi sử dụng nil? thì lại cho 2 kết quả khác nhau.

if email.nil?
  # => nếu email là "" thì vẫn được coi là có nhập dữ liệu và không gọi puts
  puts "Please input email!"
end

Đó cũng là lý do nên sử dụng blank? hơn.

if email.blank?
  # => Nếu email là "" hoặc " " thì xử lý như chưa nhập dữ liệu và gọi puts
  puts "Please input email!"
end

Tương tự như thế, khi validates trong Model, nếu không có lý do đặc biệt thì nên sử dụng allow_blank: true, không nên sử dụng allow_nil: true.

4.Sử dụng Object#try(:method_name) thay vì kiểm tra nil

if parent.children && parent.children.singleton?
  singleton = parent.children.first
  send_mail_to(singleton)
end

nếu children là nil thì try(:singleton?) cũng trả về nil

# nếu children không nil thì children.singleton? được gọi như bình thường
if parent.children.try(:singleton?)
  singleton = parent.children.first
  send_mail_to(singleton)
end

5.Khi cần filter, nên dùng query thay vì logic

Ruby cung cấp rất nhiều method hay và đơn giản để thao tác với array, nhưng khi cần thực hiện filter trong model của Rails, thì nên sử dụng query để tốc độ xử lý được nhanh hơn.

def admin_users
  User.all.select(&:admin?)
end
def admin_users
  User.where(admin: true)
end

6.Dùng pluck thay vì map

pluck là method để lấy 1 column cho trước trong các record, mà không load toàn bộ các record đó. Vì thế mà tốc độ xử lý và RAM cũng hiệu quả hơn.

def admin_user_ids
  User.where(admin: true).map(&:id)
end
def admin_user_ids
  User.where(admin: true).pluck(:id)
end

7.Các method thay đổi string thành số nhiều, số ít, …

"my_book".camelize # => "MyBook"

"MyBook".underscore # => "my_book"

"my_book".dasherize # => "my-book"

"book".pluralize            # => "books"
"person".pluralize          # => "people"
"fish".pluralize            # => "fish"
"book_and_person".pluralize # => "book_and_people"
"book and person".pluralize # => "book and people"
"BookAndPerson".pluralize   # => "BookAndPeople"

"books".singularize            # => "book"
"people".singularize           # => "person"
"books_and_people".singularize # => "books_and_person"
"books and people".singularize # => "books and person"
"BooksAndPeople".singularize   # => "BooksAndPerson"

"my_books".humanize # => "My books"

"my_books".titleize # => "My Books"

"my_book".classify  # => "MyBook"
"my_books".classify # => "MyBook"

"my_book".tableize # => "my_books"
"MyBook".tableize  # => "my_books"

8.Squish xoá các space không cần thiết

" My \r\n \t \n books ".squish # => "My books"

Tóm lại: trên đây là một số hàm mình đã tham khảo được, bài tiếp theo mình sẽ tìm hiểu và chia sẽ nhiều hàm hơn nữa, mình xin cảm ơn.


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í