12/08/2018, 15:33

Try in Rails

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 ...

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ế

0