在不知道字段的情况下添加验证

时间:2010-06-07 13:38:35

标签: ruby-on-rails validation

我的示例表单

<% 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

我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您是否尝试过多态关联?这可能是一种更清洁的方法。

http://railscasts.com/episodes/154-polymorphic-association

答案 1 :(得分:0)

免责声明:我以前从未这样做过,所以我不能100%确定它会起作用。

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