15 votes

Comment créer une application web de type Wufoo- (constructeur de formulaires) avec JQuery et Rails ?

Je cherche des conseils sur la manière de mettre en œuvre une Constructeur de type Wufoo dans une application Rails 3 avec JQuery du côté client. En gros, il s'agit de permettre à un utilisateur de construire quelque chose (un formulaire dans le cas de Wufoo) en mode "hors ligne", puis de sauvegarder toutes les modifications de l'utilisateur sur le serveur en un seul lot en cliquant sur un bouton de sauvegarde ou similaire (par exemple, cela pourrait être une sauvegarde automatique déclenchée par le navigateur toutes les 30 secondes environ).

Je penche pour l'utilisation du stockage local HTML5 à ce stade. Le "constructeur" stockerait essentiellement les modifications de l'utilisateur dans le stockage local du navigateur au format JSON. Un clic sur le bouton "Enregistrer" enverrait ensuite par HTTP le contenu du stockage local à l'application Rails, toujours au format JSON. Est-ce que cela vous semble correct ? Des conseils, des suggestions ?

Quelques considérations/questions supplémentaires :

  • Qu'en est-il des anciens navigateurs qui ne prennent pas en charge le HTML5 ? Devrait-il y avoir un plan de repli qui utilise le stockage des cookies ?
  • Y a-t-il un plugin JQuery qui peut aider à résoudre certains de ces problèmes ? Par exemple, abstraire le stockage local HTML5 comme stockage primaire et le stockage des cookies comme stockage secondaire/de secours.
  • Y a-t-il des considérations spécifiques aux rails à prendre en compte ?

Remarque : la question suivante concerne spécifiquement le constructeur de formulaires WYSIWYG et ne fournit pas vraiment de bonne solution. Création d'un constructeur de formulaires WYSIWYG (à la Wufoo) en Rails

Merci !

4voto

lee Points 353

Je me suis un peu amusé avec ceci au travail et je pense que cela pourrait vous donner une longueur d'avance sur un constructeur de formulaire jquery qui sait comment se sérialiser et se désérialiser. Je pense qu'il sérialise le formulaire en une chaîne plutôt qu'en JSON, mais c'est un début. http://www.botsko.net/blog/2009/04/07/jquery-form-builder-plugin/

Une recherche sur Google m'a permis de trouver sites.google.com/site/daveschindler/jquery-html5-storage-plugin qui dit qu'il stocke les choses dans le stockage HTML 5 avec une solution de repli vers les cookies si le navigateur ne le supporte pas.

Une autre pensée : Si l'objectif de l'utilisation du stockage local est que les utilisateurs ne perdent pas le travail qu'ils ne veulent pas encore publier, une autre option pourrait être de mettre en place des boutons "enregistrer" et "publier" distincts, afin de continuer à enregistrer le travail de l'utilisateur du côté du serveur mais de le laisser conserver les "brouillons" jusqu'à ce qu'il soit prêt à les publier, et de cette façon, le navigateur ou le PC utilisé n'aurait aucune importance.

J'espère que cela vous aidera.

4voto

mbreining Points 3981

Voici le design que j'ai fini par mettre en place. Je suis loin d'avoir une solution complète mais je pense que c'est un bon début.

Modèle de données

Dans mon cas, les utilisateurs doivent être en mesure de construire une liste de tâches où les tâches peuvent avoir différents types et donc attributs. Les tâches peuvent également intégrer des objets supplémentaires. En un sens, c'est similaire à un constructeur de formulaires, bien que je sois confronté à une hiérarchie plus profonde d'objets imbriqués. La clé ici est de s'assurer que votre application back-end n'expose que des objets qui se rapportent à votre domaine d'application (dans le sens de Conception pilotée par le domaine ) afin que votre code côté client ne perde pas de temps à remanier les données après les avoir désérialisées à partir d'un appel serveur et avant de les sérialiser en vue d'une sauvegarde. Dans cette mesure, j'ai dû apporter quelques modifications à ma couche de présentation côté serveur, mais je pense que mon code côté client est plus propre et plus concentré sur le traitement des événements réels de l'utilisateur.

Sérialisation des données

J'ai choisi JSON comme format d'échange de données. Du côté client, j'ai deux fonctions qui gèrent la sérialisation et la désérialisation des données. L'implémentation est assez simple (en partie grâce à certains des changements que j'ai effectués pour exposer les objets du modèle de domaine). J'ai collé une version simplifiée ci-dessous. Le seul problème était que le paramètre _method utilisé par Rails pour gérer les requêtes PUT ne semble pas fonctionner avec un Content-Type JSON. Voir Utilisation de HTTP PUT pour envoyer JSON avec Jquery et Rails 3

var todoList = {};

$.getJSON("/users/123/todolists/456.json", function(data) {
  loadTodoList(data);
  ...
});

function loadTodoList(data) {
  todoList = data.todoList;
}

function saveTodoList() {
  $.ajax({
    type: 'POST',
    url: "/users/123/todolists/456",
    data: JSON.stringify({ todoList: todoList }),
    contentType: 'application/json',
    dataType: 'script', // could be "json", "html" too
    beforeSend: function(xhr){
      xhr.setRequestHeader("X-Http-Method-Override", "put");
    }
  });
}

Du côté serveur, Rails permet de manipuler facilement le JSON (la sérialisation et la désérialisation du JSON sont effectuées automatiquement et de manière transparente par le framework). J'ai simplement remplacé la méthode to_json() sur mon modèle TodoList pour éviter de transmettre des données inutiles (par exemple les attributs create_at, modified_at). Je devais également m'assurer d'inclure tous les objets imbriqués lors de la récupération de mon objet de niveau supérieur (c'est-à-dire TodoList).

  # TodoListsController
  def show
    @todolist = TodoList.find_by_id(params[:id], :include => [:tasks, ...])
    respond_to do |format|
      format.json do
        render :json => @todolist.to_json
      end
    end
  end

  # TodoList model
  def to_json
    super(:only => :name,
          :include => { :tasks => { :only => [:name, :description, ...],
                                    :include => ... }})
  end

Persistance côté client

L'objectif est d'éviter de perdre accidentellement les modifications apportées par les utilisateurs qui n'ont pas été enregistrées. Pour l'instant, j'utilise directement le stockage local de HTML5 (variable localStorage), mais je chercherai finalement un plugin jQuery qui gère automatiquement le retour au stockage des cookies si HTML5 n'est pas supporté.

Génération de HTML dynamique

Je m'appuie sur Modèle jQuery pour générer du HTML. La fonction principale du constructeur est de générer dynamiquement du HTML. Ce plugin est donc très utile. J'ai défini des modèles pour tous les blocs de construction de mon modèle de liste de tâches (par exemple, les tâches, les notes, ...). Les modèles sont invoqués chaque fois que de nouvelles instances de ces objets sont créées et doivent être rendues.

Je pense que cela pose la plupart des bases. Le reste est principalement du Javascript pur et dur pour gérer toutes les interactions de l'utilisateur avec le constructeur de formulaire/todoList.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X