2010-11-19 59 views
0

J'ai un partiel qui insère dans mes formulaires l'entrée appropriée en fonction du type d'attribut du modèle. Je passe un tableau de noms d'attribut et mon partiel met un formulaire.text_field où l'attribut est une chaîne, un form.select quand l'attribut est un entier (j'ai aussi un moyen de trouver la collection de valeurs de texte associées à un attribut) et ainsi de suite avec datetime, ect. Le problème est que le besoin partiel d'être aussi générique que possible, donc je veux vérifier si j'ai un params [: search] [: attr_name] pour définir la valeur par défaut, et si un ne l'ai pas, J'utilise l'appel par défaut, qui définit la valeur du modèle dans le formulaire.Transmet une option à une méthode uniquement si une condition est vraie. Élégant?

Bien sûr, je peux faire somethig comme ça (j'utilise HAML) fonctionne:

- if search_param(field) 
    = form.text_field field, :value => search_param(field) 
- else 
    = form.text_field field 

mais il est vraiment moche. Il n'y a aucun moyen de transmettre une option à une méthode uniquement si une condition est vraie. Quelque chose comme ça.

= form.text_field field, (:value => search_param(field)) if search_param(field) 

J'ai aussi essayé de le faire:

= form.text_field field, :value => search_param(field) || field.to_sym 

mais il montre "champ" à l'intérieur de l'entrée

idées?

Répondre

0

Je ne suis pas sûr si c'est le résultat que vous voulez, mais que faire si vous au lieu de field.to_sym utiliser model.send (field) pour obtenir la valeur d'attribut du modèle? Donc, ce serait quelque chose comme ceci:

= form.text_field field, :value => (search_param(field) || model.send(field)) 
+0

Ouais! Ça marche. N'a besoin que de quelques twaeks. Premièrement: obtenir le modèle de la forme. Deuxièmement: vérifiez si form.object n'est pas NIL, car si une utilisation partielle dans un field_for, form doesn a. = champ form.text_field,: valeur => (paramètre_recherche (champ) || (formulaire.objet.send (champ) si formulaire.objet)) – Cibernox

0

Voici une façon de le faire, en utilisant l'opérateur trinaire:

form.text_field *([field] + (search_param(field) ? [:value => search_param(field)] : []))