2012-04-28 20 views
9

Trong một cái nhìn Rails, người ta có thể sử dụng try để đầu ra chỉ khi có một giá trị trong cơ sở dữ liệu, ví dụ nhưLàm thế nào để chuỗi try() và phạm vi to_s() trong Rails?

@model.try(:date) 

Và một chuỗi lon trys nếu, ví dụ, sản lượng là cần thiết như là một chuỗi

@model.try(:date).try(:to_s) 

Nhưng nếu tôi cần gọi định dạng phạm vi thì sao? Tôi đã thử

@model.try(:date).try(:to_s(:long)) 
@model.try(:date).try(:to_s).try(:long) 

Cú pháp chính xác cho điều này là gì? Và một tài liệu tham khảo tốt để giải thích thêm là gì?

Cảm ơn

Trả lời

14

Từ fine manual:

thử (* a, & b)
[...]
try cũng chấp nhận lập luận và/hoặc một khối, cho phương pháp đang thử

Person.try(:find, 1) 

Vì vậy, tôi nghĩ rằng bạn muốn:

@model.try(:date).try(:to_s, :long) 

Cái này sẽ không làm việc:

@model.try(:date).try(:to_s(:long)) 

vì bạn đang cố gắng để truy cập vào biểu tượng :to_s như một phương pháp (:to_s(:long)). Cái này sẽ không làm việc:

@model.try(:date).try(:to_s).try(:long) 

bởi vì bạn đang cố gắng để gọi phương thức long vào những gì to_s lợi nhuận và có thể bạn không có một phương pháp String#long xác định.

+0

tại chỗ! cảm ơn! –

4

mu is too short's answer cho thấy việc sử dụng chính xác cho các phương pháp try với các thông số:

@model.try(:date).try(:to_s, :long) 

Tuy nhiên, nếu bạn đang sử dụng của Ruby 2.3 hoặc mới hơn, bạn nên ngừng sử dụng try và cung cấp cho các nhà điều hành chuyển hướng an toàn một thử (không chơi chữ dự kiến):

@model&.date&.to_s(:long) 

câu trả lời sau đây là vào đây để mục đích lịch sử - thêm một rescue nil đến cuối báo cáo là considere thực hành xấu d, vì nó ngăn chặn tất cả các trường hợp ngoại lệ:

Đối với chuỗi dài có thể thất bại, tôi muốn sử dụng:

@model.date.to_s(:long) rescue nil 

Thay vì làm đầy lên quan điểm của tôi với try(...) cuộc gọi.

Ngoài ra, cố gắng sử dụng I18n.localize cho định dạng ngày tháng, như thế này:

l @model.date, format: :long rescue nil 

Xem: http://rails-bestpractices.com/posts/42-use-i18n-localize-for-date-time-formating

+0

Cảm ơn Fabio, đây thực sự là thông tin hữu ích. Tôi đã học được điều gì đó mới mẻ. –

+2

tránh giải cứu nil trừ khi bạn chắc chắn rằng bạn không bỏ lỡ bất kỳ lỗi nào khác và bạn cũng không quan tâm đến hiệu suất (tăng: ing ngoại lệ chậm) –

+1

Bạn nói đúng, @SimonB. Thật không may, tôi không biết về nó khi tôi lần đầu tiên đăng câu trả lời, vào năm 2012. Tôi đã chỉnh sửa nó, cảm ơn vì đã chú ý. –

2

Trong trường hợp bạn thường sử dụng thử dây chuyền mà không cần khối, một lựa chọn là để kéo dài tuổi Lớp đối tượng:

class Object 
    def try_chain(*args) 
    args.inject(self) do |result, method| 
     result.try(method) 
    end 
    end 
end 

Và sau đó chỉ cần sử dụng @model.try_chain(:date, :to_s)

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