2010-10-11 4 views
2

J'espère que quelqu'un pourra m'aider. Travaille actuellement sur un projet RoR qui nécessite un type de fonctionnalité étrange.Rails, permettant aux utilisateurs de créer un formulaire qui sera utilisé par d'autres utilisateurs

Fondamentalement, j'ai deux types d'utilisateurs nommés utilisateur et chercheur. Les utilisateurs peuvent créer des formulaires et ces formulaires sont stockés dans la base de données et remplis par les chercheurs.

Je possède ce schéma de base

create_table "form_fields", :force => true do |t| 
    t.string "name" 
    t.string "form_field_type" 
    t.integer "form_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "forms", :force => true do |t| 
    t.integer "visit_id" 
    t.string "name" 
    t.integer "form_category_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "researchers", :force => true do |t| 
    t.string "email",        :default => "", :null => false 
    t.string "encrypted_password", :limit => 128, :default => "", :null => false 
    t.string "password_salt",      :default => "", :null => false 
    t.string "reset_password_token" 
    t.string "remember_token" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",      :default => 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "researchers", ["email"], :name => "index_researchers_on_email", :unique => true 
    add_index "researchers", ["reset_password_token"], :name => "index_researchers_on_reset_password_token", :unique => true 

    create_table "results", :force => true do |t| 
    t.integer "form_id" 
    t.integer "subject_id" 
    t.string "form_field_name" 
    t.string "form_field_value" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "users", :force => true do |t| 
    t.string "email",        :default => "", :null => false 
    t.string "encrypted_password", :limit => 128, :default => "", :null => false 
    t.string "password_salt",      :default => "", :null => false 
    t.string "reset_password_token" 
    t.string "remember_token" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",      :default => 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
    add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true 

    create_table "visits", :force => true do |t| 
    t.string "name" 
    t.integer "visit_order" 
    t.integer "study_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

Ainsi, un utilisateur crée les formes et form_fields et un chercheur se connecte ensuite et est fourni avec ce formulaire

<% form_for [:researcher, @study, @subject, @visit, @form, Result.new] do |f| %> 

    <% @form.form_fields.each do |form_field| %> 

     <%= f.label form_field.name, :index => form_field.id %> 
     <%= f.hidden_field :form_field_name, :value=>form_field.name, :index => form_field.id %> 
     <%= f.text_field :form_field_value, :index => form_field.id %><br/> 
     <%= f.hidden_field :form_id, :value=>@form.id, :index => form_field.id %> 
     <%= f.hidden_field :subject_id, :value=>@subject.id, :index => form_field.id %> 

    <% end %> 


    <%= f.submit %> 

<% end %> 

Ainsi, le résultat est stocké dans la table des résultats et c'est tout.

Je peux me voir avoir des problèmes en essayant de permettre aux utilisateurs de définir des validations sur chaque champ_formulaire.

Quelqu'un at-il de l'expérience avec ce problème?

+0

Je veux construire quelque chose comme ça, qu'avez-vous trouvé était la meilleure méthode? – JoeChin

Répondre

0

Je voudrais réellement regarder dans ce problème de façon plus propre Utilisation de l'héritage Table unique.

Vous créez un modèle Utilisateur et définissez toutes les validations et méthodes communes au chercheur et à l'utilisateur dans le fichier user.rb.

class User < ActiveRecord::Base 
    #all validations code and other logic related to users and researchers 
end 

Créer un autre modèle researcher.rb comme

class Researcher < User 
    #create validations and logic code specific to researcher 
end 

Il y aura une seule table "utilisateurs". Et il y aura une colonne supplémentaire (en dehors de tous les e-mails, noms, etc.) qui est colonne "type". Cette colonne de type se réfère à savoir si l'enregistrement est chercheur ou utilisateur.

définir une méthode dans researcher.rb comme

def can_fill_form? 
    return true 
end 

et faire la même méthode dans user.rb comme

def can_fill_form? 
    return false 
end 

En faisant cela, il vous suffit d'une table avec tous les utilisateurs et les chercheurs dedans. Des choses comme l'email, le téléphone, le mot de passe sont tous les mêmes et créer un type de table séparé est redondant ici.

+0

Merci pour votre réponse lakshmanan, mais je pense que vous avez peut-être mal compris ma question qui est basée sur le principe de permettre aux utilisateurs de créer des formulaires qui seront utilisés par d'autres utilisateurs. – stuartchaney

+0

Toujours pas de preneurs? ... – stuartchaney

0

Voici comment je gérer cela ...

j'aurais un modèle User que has_manyForm modèles. Chaque modèle de formulaire aurait beaucoup de FormComponents. Le modèle FormComponent aurait des champs pour ce type d'élément de forme il est, quel type de validation, les valeurs par défaut, etc.

Le Researcher serait servi sous forme par le FormController, qui traiterait le modèle et afficher la forme base sur quoi FormComponents étaient présents. Quand un Researcher complété le formulaire, je voudrais emballer la réponse comme FormResponse qui appartient à la fois à Researcher et Form.Gardez à l'esprit ceci est juste une idée approximative de la façon dont cette idée se déroulerait, mais à mon avis, un système similaire à celui-ci serait la meilleure façon de le gérer.

Questions connexes