← Quay về trang chủ

Một số hàm được thêm vào Object trong Rails

phiên bản được sử dụng trong bài viết là Rails 7.0.2.3, Thông tin mình lấy từ trang api của rails

Với việc mọi Object trong Ruby đều kế thừa từ Class Object, thì khi Rails thêm một số hàm vào class này, toàn bộ các object khác đều có thể sử dụng được, và đây cũng là các hàm hỗ trợ rất nhiều cho bạn trong quá trình code.

.blank?(), .present?()

Một object là balnk nếu nó false, empty, hoặc là một string rỗng. Bạn có thể xem source code.

def blank?
  respond_to?(:empty?) ? !!empty? : !self
end

Theo đó thì object nào empty hoặc là falsey value thì sẽ blank

0.blank? # false
[].blank? # true
''.blank? # true

Hàm .present? thì đơn giản là ngược lại với .blank?

def present?
  !blank?
end

.presence()

Trả về bản thân object đang gọi nếu nó present (object.present? => true) còn không thì trả về nil. object.presence tương đương với

object.present? ? object : nil

Ví dụ mà presence có thể giúp bạn giảm bớt việc code

state   = params[:state]   if params[:state].present?
country = params[:country] if params[:country].present?
region  = state || country || 'US'

# tương đương với

region = params[:state].presence || params[:country].presence || 'US'

Mã nguồn của .presence

def presence
  self if present?
end

.in?(another_object), .presence_in(another_object)

.in? trả về true nếu object hiện tại nằm trong argument. Argument phải là Array, String hoặc object nào có hàm #include?, nếu không nó sẽ trả về lỗi ArgumentError, cùng xem mã nguồn của hàm này để hiểu tại sao

def in?(another_object)
  another_object.include?(self)
rescue NoMethodError
  raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
end

Tiếp theo là sự kết hợp giữa .presence.in? hàm .presence_in trả về object đang gọi nếu thỏa mãn .in? hoặc trả về nil.

1.in? [1,2,3,4] # true
'banana'.in? 'strawberry apple' # false
1.presence_in [1,2,3,4] # 1
'banana'.presence_in 'strawberry apple' # nil