Rails,允许用户创建将由其他用户使用的表单

时间:2010-10-11 17:49:16

标签: ruby-on-rails ruby forms activerecord

希望有人可以帮助我。目前正在开发一个需要奇怪功能的RoR项目。

基本上,我有两种类型的用户名为User和Researcher。用户可以创建表单,这些表单存储在数据库中并由研究人员填写。

我有这个基本架构

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

因此,用户创建表单和form_fields,然后研究人员登录并提供此表单

<% 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 %>

所以结果存储在结果表中,就是那个。

在尝试允许用户在每个form_field上设置验证时,我发现自己遇到了麻烦。

有人有这方面的经验吗?

2 个答案:

答案 0 :(得分:1)

以下是我将如何处理......

我会拥有User has_many模型的Form模型。每个Form模型都有很多FormComponentsFormComponent模型将包含表单元素类型,验证类型,默认值等字段。

Researcher将由FormController提供表单,该表单将处理模型并根据FormComponents存在的内容显示表单。当Researcher填写表单后,我会将回复打包为属于FormResponseResearcher的{​​{1}}。

请记住,这只是对这个想法如何发挥作用的粗略概念,但在我看来,类似于此的计划将是处理它的最佳方式。

答案 1 :(得分:0)

我实际上会更清楚地研究这个问题使用单表继承。

您可以创建模型用户,并在user.rb文件中定义研究人员和用户共同的所有验证和方法。

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

创建另一个模型研究员.rb,如

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

只有一个表“用户”。还有一个额外的列(除了所有电子邮件,名称等等),这是“类型”列。此类型列指的是记录是研究人员还是用户。

在researcher.rb中定义一些方法,如

def can_fill_form?
  return true
end

并在user.rb中使用相同的方法,如

def can_fill_form?
   return false
end

通过这样做,您只需要一个包含所有用户和研究人员的表。像电子邮件,电话,密码这样的东西都是一样的,在这里创建一个单独类型的表是多余的。