2011-10-18 47 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

是的,并且认为他根本没有服务。他没有任何服务,或者,如果你愿意,没有任何属性。 –