2011-10-18 45 views
1

所以我在一個應用程序中使用MongoDB,並且我的文檔的字段已經增加了,但在我的視圖中,我不希望每個屬性都有一個if塊,我如何才能使用rails來顯示該屬性是否存在,否則只是靜靜地不做任何事情?Ruby,MongoDB,不要抱怨未定義的方法?


例子:

由於蒙戈是無模式的這些數值不會在我的模型的早期實例來定義。

<%= @company.address %> 
<%= @company.longitude %> 
<%= @company.latitude %> 

我該如何處理?

+0

您使用的是MongoDB Ruby驅動程序還是任何種類的ORM? –

+0

嘿喬納斯,我正在使用Mongoid –

回答

1

如果你希望它只是應付,你總是可以實現對類就靠電話和返回自己method_missingnil

class Company 
    def method_missing(*args) 
    nil 
    end 
end 

這可能掃在地毯下存在的一些問題,所以你在做這類事情時可能要小心。

你也可以將一個擴展,讓你這樣做:

= @company.try_method(:address) 

這將返回nil如果沒有,如果你在初始化添加此address方法:

class Object 
    def try_method(method, *args) 
    respond_to?(method) ? send(method, *args) : nil 
    end 
end 

try只有當方法可能返回nil時,Rails的一部分方法纔會起作用,但如果未定義該方法,則不會。

+0

我想我想知道的是,所有這些基於文檔的ORM都基本沒有圖式,這不是越來越多人遇到的越來越多的問題嗎?很好的答案。 –

+0

我沒有對他們做過多的事情,但我敢打賭,你應該使用它們,因爲你可能使用'[]'訪問器而不是JavaScript方法風格。在JavaScript中,object.arbitrary默認爲'null',而在Ruby中,它是一個未定義的方法調用。 – tadman

1

Mongoid支持field default values

class Company 
    include Mongoid::Document 
    field :address, type: String, default: "" 
end 
+0

只要你可以安全地將它轉換爲字符串,視圖並不在乎你給它什麼。 '<%= (expr) %>'的結果始終是'(expr).to_s',並且足夠方便'nil.to_s'返回一個空字符串。 – tadman

+0

是的,並且認爲他根本沒有服務。他沒有任何服務,或者,如果你願意,沒有任何屬性。 –