2010-06-07 67 views
1

我的例子形式添加验证不知道该领域

<% form_for @ad do |f| %> 
    <%= f.error_messages %> 
    <p> 
    <%= f.label :ad_type_id %><br /> 
    <%= f.collection_select(:ad_type_id, AdType.all, :id, :name) %> 
    </p> 
    <p> 
    <% @ad.ad_properties.each do |property| %> 

     <%= property.name %>: 
     <% f.fields_for :ad_values do |value_field| %> 
     <%= value_field.text_field :ad_id, :value => @ad.id %> 
     <%= value_field.text_field :ad_property_id, :value => property.id %> 
     <%= value_field.text_field :value %> 
     <% end %><br /><br /> 

    <% end %> 
    </p> 
    <p> 
    <%= f.label :description %><br /> 
    <%= f.text_area :description %> 
    </p> 
    <p><%= f.submit %></p> 
<% end %> 

说明:
广告具有许多特性。我可以随时添加新的属性(这是一个普通的模型)。
可以说广告是“酒店”类型的。然后我会添加属性,如'星星'和'breakfast_included'
然后我将这些属性的每个值存储在一个单独的模型中。
而这一切都可以正常使用我的表格。

我的问题:
这些字段没有验证,因为我不知道他们的名字是什么。
我需要以某种方式动态添加验证。

我的想法:

#Before the normal validations kick in 
def add_validations 
    self.properties.each do |property| 
    property.add_validation :whatever #somehow :) 
    end 
end 

我怎么能这样做?

回答

0

免责声明:我从来没有这样做过,所以我不是100%肯定它会工作。

但是,只要您可以获得您正在使用的对象的类型,就可以使用Rails constantize方法获取它引用的模型(我假设如果广告可以是酒店类型,那么您有一个酒店模型)。此时,您应该在您的酒店模型上进行适当的验证。

+0

就是这样。我没有针对每种AdType的模型。我希望能够将新类型添加到该表中,然后为该新类型添加新的AdProperties。 通过管理建立结构基本上:) – Frexuz 2010-06-09 15:54:18