9
votes

Comment ajouter des champs de formulaire supplémentaires en dehors du bloc de déclaration de formulaire

L'objectif principal: strong> Autoriser les plugins, Gems d'ajouter des champs de formulaire supplémentaires aux formulaires prédéfinis.

Par exemple, l'application a un formulaire de connexion à l'intention:

<%= form_for(resource, :as => resource_name, ...) do |f| %>
  <%= devise_error_messages! %>
  ...
<% end %>


0 commentaires

3 Réponses :


1
votes

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


3 commentaires

Comment avez-vous enregistré des données soumises?


Je l'ai sauvé en créant une table user_answers. userSwer qui a appartient à l'utilisateur: utilisateur; appartient_to supplémentfield; avec les champs de user_id, supplémentaire_field_id, réponse_value


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.



2
votes

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 Application.js exiger le fichier JS de la gemme, par exemple nécessite 'promotionnel / application.js , si le gemme était appelé "promo".

Regardez les docs pour Builder de formulaire personnalisé

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 railtie ou moteur . xxx

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.


3 commentaires

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 méthode ajoute Authenticity_Token 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 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 , mais il suffit d'envelopper les aides de formulaire natif et de configurer leur propre API.



0
votes

Dans ce cas, un nouveau gemme doit être créé qui sera -

  1. Ajouter promo_code au modèle utilisateur et le rendre accessible
  2. Remplacer le formulaire de congé pour incorporer une entrée de code promotionnel (copier simplement la vue de pâte et ajouter le champ Promo)
  3. Ajouter les validations nécessaires et traitement supplémentaire (rappels) dans le modèle utilisateur (méta-programmation sur la classe d'utilisateurs)

    Nous ne faisons aucune modification dans l'application principale, nous sommes donc en sécurité.


2 commentaires

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.