Try in Rails
Bài đăng này đã không được cập nhật trong 7 năm
Trong Rails, try() cho phép bạn gọi các method trên một đối tượng mà không phải lo lắng về khả năng method của đối tượng đó đã được định nghĩa hay chưa và cũng không cần phải bắt exception cho nó. Mình thấy trong thực tế try() được dùng rất nhiều bởi sự thuận tiện của nó.Vì vậy, hôm nay mình muốn giới thiệu ngắn gọn về method này.
Before
Dưới đây là một example đơn giản về cách sử dụng và ý nghĩa try (). Giả sử bạn đã có một mô hình product. Product có thể có hoặc không có manufacturer và dưới đây là show page details của một product để hiển thị sản phẩm:
<h1><%= @product.name %></h1>
<% unless @product.manufacturer.nil? %>
<%= @product.manufacturer.name %>
<% end %>
<% if current_user && current_user.is_admin? %>
<%= link_to 'Edit', edit_product_path(@product) %>
<% end %>
bạn thấy dòng này không unless @product.manufacturer.nil?
trước khi show tên của manufacture thì mình phải kiểm tra xem sản phẩm này có manufacturer trước đã. nếu trong trường hợp sản phẩm không có manufacturer thì @product.manufacturer.name
sẽ gây ra exception ngay. Vậy try() sẽ giúp bạn giải quyết mà không cần phải dùng unless
khó chịu kia nữa
<h1><%= @product.name %></h1>
<%= @product.manufacturer.try :name %>
<% if current_user && current_user.is_admin? %>
<%= link_to 'Edit', edit_product_path(@product) %>
<% end %>
Trong trường hợp @product.manufacturer
return nil, thì nil.try :name sẽ trả về nil. Đấy bạn thấy tiện hơn không.
With arguments and blocks
Bạn cũng hoàn toàn truyền tham số hoặc block cho try() như ví dụ sau.
@manufacturer.products.first.try(:enough_in_stock?, 32)
# => "Yes"
@manufacturer.products.try(:collect) { |p| p.name }
# => ["3DS", "Wii"]
Chaining
Bạn có thể kết hợp nhiều try() với nhau. Trong một ví dụ khác, giả sử bạn đã có một method trong mô hình manufacturer model của bạn gửi cho manufacturer một tin nhắn bất cứ khi nào được gọi.
class Manufacturer < ActiveRecord::Base
has_many :products
def contact
"Manufacturer has been contacted."
end
end
Product.first.try(:manufacturer).try(:contact)
#=> nil
Product.last.try(:manufacturer).try(:contact)
#=> "Manufacturer has been contacted."
Further reading
Bạn có thể tham khảo thêm https://apidock.com/rails/Object/try Hy vọng sẽ giúp được bạn phần nào về cách sử dụng method try() trong thực tế
All rights reserved