我的示例表单
<% 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 %>
说明:
广告有很多属性。我可以随时添加新属性(这是正常模型)
让我们说广告属于'酒店'类型。然后我会添加像'stars'和'breakfast_included'这样的属性
然后我将每个属性的值存储在一个单独的模型中
所有这些都适用于上面的表单。
我的问题:
这些字段未经过验证,因为我不知道他们的名字是什么
我需要以某种方式动态添加验证。
我的想法:
#Before the normal validations kick in
def add_validations
self.properties.each do |property|
property.add_validation :whatever #somehow :)
end
end
我怎么能这样做?
答案 0 :(得分:0)
您是否尝试过多态关联?这可能是一种更清洁的方法。
答案 1 :(得分:0)
免责声明:我以前从未这样做过,所以我不能100%确定它会起作用。
但是只要你能得到你正在使用的对象的类型,就可以使用Rails constantize方法来获取它引用的模型(我假设如果广告可以是类型的酒店,那你有一个酒店模型)。此时,您可能应该对您的酒店模型进行适当的验证。