Par exemple, l'application a un formulaire de connexion à l'intention:
<%= form_for(resource, :as => resource_name, ...) do |f| %>
<%= devise_error_messages! %>
...
<% end %>
3 Réponses :
idée en étapes:
1) Définissez un modèle tel que supplémentffield (ID, champ de nommé, field_type, défaut_value, is_requiked) p>
2) puis créez une fonction comme: p>
# TURN GUEST/QUESTIONS INTO guest answers if params[:booking] && !params[:booking].blank? && !params[:booking][:guest_answer_attributes].blank? params[:booking][:guest_answer_attributes].each do |k,v| handle_answers(k, v) end end def handle_answers(k, v) x = k.mb_chars.split(/_/) g_id = x[2] q_id = x[3] item = GuestAnswer.find_or_create_by_guest_id_and_convention_question_id( {:guest_id => g_id, :convention_question_id => q_id, :answer => v}) end
Comment avez-vous enregistré des données soumises?
Je l'ai sauvé en créant une table user_answers. userSwer code> qui a
appartient à l'utilisateur: utilisateur; appartient_to supplémentfield; code> avec les champs de
user_id, supplémentaire_field_id, réponse_value code>
Uzbekjon - J'ai ajouté le code que j'ai utilisé pour le projet que j'ai fait. N'hésitez pas à demander plus si cela n'a pas de sens.
Tout d'abord, votre idée d'isoler ce code dans un gemme / rail / moteur est excellent. Je pense que votre meilleur pari peut être de la correction de singe la méthode de la forme_for et de rester dans le champ Extra. En ce qui concerne le déclencheur de soumission, si vous êtes sur Rails 3.1 et utilisez le pipeline d'actif, vous pouvez également servir JavaScript, bien que cela nécessiterait une petite modification de votre Regardez les docs pour Builder de formulaire personnalisé P> Voici quelques idées difficiles comment cela pourrait-il travail, bien que je n'ai pas essayé ce code. Je mettrais ceci dans le fichier promo.rb que les sous-classes Down the route, esp. Si votre service marketing peut organiser davantage de campagnes, vous pouvez même vouloir modifier les formulaires de l'application, pour pointer vers un constructeur spécifique que vous pouvez remplacer d'un joyau sans la correction de singe ici. P> P> Application.js code> exiger le fichier JS de la gemme, par exemple
nécessite 'promotionnel / application.js code>, si le gemme était appelé "promo".
moteur code>. P>
Merci de pointer dans la direction "Connaissance de la forme personnalisée". Votre réponse est la plus proche de ce que je veux. Je pense que je vais écrire un constructeur de formulaire personnalisé qui ajoute du champ caché (idée similaire à "_method") et ajoutez un middleware de rack qui vérifie ce champ et déclenche des méthodes supplémentaires dans mes moteurs / plugins.
Diving plus profondément dans le code des rails J'ai trouvé extra_tags_for_form code> méthode ajoute
Authenticity_Token code> Tags. Je vais soumettre une demande de traction qui permettra d'autres méthodes d'ajouter des balises supplémentaires. Mais j'ai eu un sentiment que cela aurait dû déjà été fait par des gens plus intelligents que moi. Y a-t-il un moyen d'ajouter une balise à toutes les formes (la manière dont
protégez_from_forgery code> fait)?
@Uzbekjon J'avais la même pensée, mais je ne pouvais pas trouver un crochet pour ça. Je pensais à faire des champs de piratage_fo pour faire cela, mais il n'était pas évident que cela n'aurait pas d'effets secondaires. Je suis aussi surpris que vous êtes que cela n'a pas été fait. J'ai également vérifié le code simple_form code>, mais il suffit d'envelopper les aides de formulaire natif et de configurer leur propre API.
Dans ce cas, un nouveau gemme doit être créé qui sera - p>
Nous ne faisons aucune modification dans l'application principale, nous sommes donc en sécurité. P>
Oui, cette méthode s'entraînerait bien si vous n'avez qu'un "changement". Mais si vous avez plus d'un plugin qui veut changer le formulaire. La méthode implique que les développeurs devront garder une trace de toutes les gemmes et plugins qui changent actuellement le formulaire.
De suivi des moteurs externes et de ce qu'ils font doivent être conservés tout en faisant d'autres changements.