2009-03-03 39 views
9

Chúng tôi tiếp tục cảnh báo nhìn thấy như sau khi chúng tôi chạy thông số kỹ thuật của chúng tôi:của Ruby Object # id cảnh báo và Active Record

Object # id sẽ bị phản đối; sử dụng Object # object_id

Mã được đề cập là truy cập vào id của mô hình ActiveRecord (là thuộc tính trên bảng, rõ ràng hơn là ID cá thể đối tượng trong Ruby VM).

Có ai biết cách tắt các cảnh báo cụ thể này hoặc bằng cách nào đó tránh chúng không?

+0

Nếu đây là trong một thử nghiệm, bạn có chắc bạn đang truy cập vào một hoạt động thực thực thể ghi lại, và không phải là một đối tượng ruby ​​thông thường? –

+0

Ah ... những vật thể này cũng có thể là đối tượng giả mạo –

+0

Bạn nên trả lời câu hỏi, bởi vì điều đó hoàn toàn cố định nó. –

Trả lời

6

tôi giả sử bạn đang làm chế giễu/stubbing (vì bạn đề cập đến thông số kỹ thuật).

Trong trường hợp của mình, tôi chạy vào các cảnh báo này khi tôi đưa đối tượng ActiveRecord và truy cập thuộc tính ID của nó.

Trong trường hợp bạn mong đợi để truy cập vào ID của đối tượng ActiveRecord của bạn, tôi muốn khuyên bạn nên làm như sau:

mock("MyActiveRecordObject", :id => 1001) 
10

Khi đối tượng được hạ xuống từ ActiveRecord::Base, gọi tới id chuyển sang phương thức AR :: B's id thay vì số không được chấp nhận trên Object.

Cảnh báo đó thường có nghĩa là một trong những đối tượng của tôi không phải là những gì tôi nghĩ.

+0

Tôi ước tôi có thể chấp nhận hai câu trả lời chính xác ... –

2

Cảnh báo # id đối tượng chỉ xảy ra trên các lớp ruby ​​thông thường như NilClass. ActiveRecord :: Ghi đè cơ sở đối tượng # id

4

Đối tượng của bạn không thực sự là đối tượng AR, thường chỉ ra rằng một số truy xuất dữ liệu không thành công (Table.find_by_name('nonexistent name') sẽ trả về nil). Nếu tất cả những gì bạn muốn làm là tắt cảnh báo có thể nhìn thấy, bạn có thể tắt whiny_nils trong cấu hình của mình, nếu không, hãy thực hiện kiểm tra is_a? trước khi cố truy cập thuộc tính của đối tượng và xử lý trường hợp lỗi một cách duyên dáng.

15

Hãy thử sử dụng [:id] thay vì .id

+0

tại sao câu trả lời này lại bị bỏ phiếu? đúng. – ttvd

+0

Bởi vì có một người dùng độc hại và làm giảm mọi thứ của tôi. –

+0

i am upvoting this .. – bragboy

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