带Rails 3的动态场

| 我有一个设计要解决的问题。 我正在构建一个Rails 3应用程序,该应用程序将容纳来自各种不同公司的产品。我想定义大量字段,每种产品都可以选择适用于它的字段。 字段类型将是单行文本字段,多行文本字段,单选或选择选项,复选框选项,日期,持续时间或更自定义的内容。我需要能够根据此类型动态呈现字段以进行编辑和显示。 我当前的想法是使用MongoDB并将所有内容存储在产品的哈希中。
class Product
  include Mongoid::Document
  def self.field_definitions
    [{ :name => :code, :label => \'Code\' },
     { :name => :itinerary, :type => :multiline, :label => \'Itinerary\', :category => :tour},
     { :name => :infant_age, :type => :age_range, :label => \'Infante age range\', :category => :tour},
        ...
     ]
  end

  embedded_in :company
  field :field_data, type:Hash
end
然后渲染新的/编辑的字段,例如:
= form_for Product.new do |f|
  = f.fields_for :field_data do |f|
    %ol
      - Product.field_definitions.each do |field_definition|
        %li
          = f.label field_definition[:name], field_definition[:label]
          = render \"products/edit_fields/#{field_definition[:type] || \'singleline\'}\", :f => f, :field_definition => field_definition

  = f.submit \"Create\"
然后,我对每种字段类型都有部分内容进行编辑和显示。 创建后,产品在mongodb中可能如下所示:
{\"field_data\":{
    \"itinerary\": \"FUN!\",
    \"code\": \"AHKDYK\", 
    \"infant_age\": { \"max\": 2, \"min\": 0 } 
}}
这是一个好方法吗?     
已邀请:
当然,这会起作用-但是您知道您不必去Mongo只是为了能够在数据库中存储值的散列。您还可以将属性设置为“ 3”,然后Rails会将其转换为YAML并在返回的途中返回一个(简单的)对象。 对于您描述的模式,这是一种相当普遍(且非常可行)的方法。     
您可以将这些字段定义为Mongoid :: Document字段,并将Product.fields用作自省。然后,您可以利用ActiveModel的功能(例如验证)和i18n(如果需要)。     

要回复问题请先登录注册