2010-02-27 29 views
12

Tôi muốn hiển thị một dòng văn bản chỉ khi một đối tượng được gọi là @foo được đặt. Theo quan điểm của tôi, tôi đang cố gắng một cái gì đó như thế này:Làm thế nào để kiểm tra xem một đối tượng là nil trong một khung nhìn trong Ruby?

<% if [email protected]_record? || [email protected]? %> 
    Foo is not a new record or nil 
<% end %> 

Nhưng điều này thất bại, trở về You have a nil object when you didn't expect it! Tôi chắc rằng điều này xảy ra vì phương pháp new_record?. Làm cách nào để kiểm tra xem có gì đó không phải là bản ghi mới hay không mà không gây ra lỗi? Trong PHP, nó sẽ đạt được bằng cách yêu cầu if(!empty($foo)) nhưng ngay cả phương pháp empty? trong đường ray cũng gây ra cùng một lỗi được trả lại.

Bất kỳ ý tưởng nào?

Trả lời

13

Làm thế nào về:

<% if [email protected]? && [email protected]_record? %> 
    Hello! 
<% end %> 

Trước hết, bạn cần phải sử dụng và logic hơn là OR logic ở đây, vì bất kỳ ActiveRecord đối tượng đáp ứng ít nhất một trong những yêu cầu của "không nil" hoặc "không một kỷ lục mới ".

Thứ hai, kiểm tra đầu tiên không đảm bảo rằng lần kiểm tra thứ hai không chạy nếu lần kiểm tra đầu tiên không thành công. Lỗi này được ném bởi vì bạn không thể sử dụng #new_record? trên một đối tượng không hỗ trợ nó, vì vậy hãy kiểm tra trước tiên để đảm bảo rằng phương thức đó không bao giờ chạy trên một số không.

+0

trực quan nhất! cảm ơn bạn! –

+1

Bạn cũng có thể khá lên một chút với Luật của DeMorgan: 'trừ khi @ foo.nil? || @ foo.new_record ?; đặt 'Hello!'; kết thúc; ' –

+4

'! foo.nil? 'làm cho não của tôi bị chảy máu bởi vì nó có thể được thay thế bằng 'foo'. Làm cho một thành ngữ ruby ​​rất đơn giản và phổ biến: 'if @foo &&! @ Foo.new_record? ' –

1

Tôi sẽ kiểm tra bằng if @foo && @foo.id. Điều này kiểm tra rằng có một đối tượng @foo activerecord và đảm bảo rằng trường id không trống. Nếu trường id trống, điều đó có nghĩa nó không phải là bản ghi trong cơ sở dữ liệu. Tôi cho rằng bạn đang sử dụng trường id trong bảng.

+0

súc tích nhất! cảm ơn bạn! –

3

Bạn có thể quan tâm đến những cũng như:

<%= @foo.text if @foo.present? %> 

hoặc

<%= @foo.text unless @foo.blank? %> 
+0

những điều này không kiểm tra xem @foo có trống không, nhưng cảm ơn các phương thức bổ sung –

1

Cách đơn giản là

<% if [email protected](:new_record) %> 
    Hello! 
<% end %> 
+0

trông như thế này không hoạt động –

1

Có một lý do tại sao đối tượng này có thể là con số không khi nó được xem? Đôi khi thêm logic điều kiện như thế này trong khung nhìn có thể là một dấu hiệu cho thấy một cái gì đó có thể được tái cấu trúc và bạn chỉ đang che giấu một vấn đề lớn hơn.

0

Tôi thích sử dụng số andand gem cho các séc này.

if @foo.andand.id 
    "Hello!" 
end 

Cuộc gọi tới .id sẽ chỉ được thực hiện trên đối tượng không phải là không.

2

Hãy để tôi ném một câu trả lời khác chỉ để cho vui.

unless @foo.nil? or @foo.new_record? 
    "Hello" 
end 
Các vấn đề liên quan