2010-09-02 26 views
11

Tôi thường viết mã để cung cấp một giá trị mặc định khi gặp phải giá trị nil/trống.Có được hỗ trợ trong đường ray cho thành ngữ thay thế giá trị mặc định không?

ví dụ:

category = order.category || "Any" 
# OR 
category = order.category.empty? ? "Any" : order.category 

tôi về để kéo dài tuổi try phương pháp để xử lý các thành ngữ này.

category = order.try(:category, :on_nill => "Any") 
# OR 
category = order.try(:category, :on_empty=> "Any") 

Tôi tự hỏi liệu Rails/Ruby có phương pháp nào để xử lý thành ngữ này không?

Lưu ý:

Tôi cố gắng để loại bỏ sự lặp lại của các thành ngữ dựa ||/or/? điều hành.

Về cơ bản, tôi đang tìm kiếm phương thức tương đương với phương thức try để xử lý các trường hợp thay thế mặc định.

Without try phương pháp:

product_id = user.orders.first.product_id unless user.orders.first.nil? 

Với try phương pháp:

product_id = user.orders.first.try(:product_id) 

Nó rất dễ dàng để thực hiện một cách tiếp cận chung để xử lý thành ngữ này, nhưng tôi muốn chắc chắn rằng tôi không phát minh lại bánh xe.

Trả lời

12

Xem this question. ActiveSupport thêm phương thức presence cho tất cả các đối tượng trả về bộ thu nếu present? (đối diện với blank?) và nil nếu không.

Ví dụ:

host = config[:host].presence || 'localhost' 
+0

Câu trả lời cực hay! – kamal

1

Có lẽ điều này có thể phục vụ:

class Object 
    def subst_if(condition, replacement) 
    condition = send(condition) if condition.respond_to?(:to_sym) 
    if condition 
     replacement 
    else 
     self 
    end 
    end 
end 

Được sử dụng như sau:

p ''.subst_if(:empty?, 'empty')  # => "empty" 
p 'foo'.subst_if(:empty?, 'empty') # => "foo" 

Nó cũng có điều kiện độc lập, không liên quan đến các đối tượng:

p 'foo'.subst_if(false, 'bar') # => 'foo' 
p 'bar'.subst_if(true, 'bar') # => 'bar' 

tôi m không điên về tên subst_if. Tôi muốn mượn bất kỳ tên Lisp nào sử dụng cho hàm này, nếu tôi biết nó (giả sử nó tồn tại).

+0

+1, đây là một cách tiếp cận thú vị. Tôi đã suy nghĩ về việc mở rộng phương thức 'try', vì tôi đã sử dụng nó ở nhiều nơi. –

0

Khá chắc chắn không được nướng. Đây là liên kết đến một số similar question/answer. Đó là cách tiếp cận mà tôi thực hiện. Tận dụng ruby: ||= cú pháp

Một sang một bên: Câu hỏi này cũng nhắc nhở tôi về Railscasts đầu tiên của mọi thời đại: Caching with instance variables mà là một hình màn ảnh hữu ích nếu bạn cần phải làm điều này loại hoạt động trong một điều khiển

Các vấn đề liên quan