2010-06-07 5 views
1

Mon exemple sous formesans connaître les validations champs

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

Explication:
Ad possède de nombreuses propriétés. Je peux ajouter de nouvelles propriétés à tout moment (c'est un modèle normal).
Disons que l'annonce est du type «hôtel». Ensuite, j'ajouterais des propriétés comme 'stars' et 'breakfast_included'
Ensuite, je stocke chacune des valeurs de ces propriétés dans un modèle séparé.
Et tout cela fonctionne très bien avec ma forme ci-dessus.

Mon problème:
Ces champs ne sont pas validés car je ne peux pas savoir quels sont leurs noms.
J'ai besoin d'ajouter des validations de façon dynamique.

Ma pensée:

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

Comment pourrais-je faire cela?

Répondre

0

Disclaimer: Je ne l'ai jamais fait ça avant, donc je ne suis pas 100% sûr qu'il fonctionnera. Mais tant que vous pouvez obtenir le type de l'objet que vous utilisez, vous pouvez utiliser la méthode Rails constantize pour obtenir le modèle auquel il fait référence (je suppose que si l'annonce peut être de type Hotel, alors vous avoir un modèle d'hôtel). À ce stade, vous devriez probablement avoir les validations appropriées sur votre modèle d'hôtel.

+0

C'est la chose. Je n'ai pas de modèle pour chaque AdType. Je veux être en mesure d'ajouter de nouveaux types à cette table, puis ajouter simplement de nouvelles propriétés d'AdProperties pour ce nouveau type. Construire une structure par l'administration essentiellement :) – Frexuz

Questions connexes