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
là
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
và .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