代码之家  ›  专栏  ›  技术社区  ›  Dave Rapin

向activerecord模型添加可读字段描述

  •  3
  • Dave Rapin  · 技术社区  · 15 年前

    我想向activerecord模型字段添加描述,作为每个字段的基本说明/示例。基本上是模型元数据。然后我可以在ui中显示这些内容(在表单的字段旁边等)。

    我计划的方法是在模型中创建一个静态哈希表,字段名作为键,描述作为值。即。

    FIELD_DESCRIPTIONS = {
      'category' => 'Select the category it should appear within.',
      'title' => 'The title should be a short but descriptive summary.',
      'description' => 'Please enter a full description.'
    }
    

    等。

    然后,我将创建一个基本的表单助手,将这些解释包装在一个范围内(最初是通过jquery隐藏和显示的),这样它们就可以通过f.field_description(:title)或其他类似的方式进行设置。

    有人有更好的主意吗?我希望将此字段元数据保留在模型中,因为许多视图可以使用相同的信息,而且我还认为,当您回头查看代码时,在模型中包含描述是很好的(比如如何在模型中使用datamapper来指定字段)。

    为了让您更详细地了解我已经做了些什么(而且效果很好),下面是代码。我认为在模型中必须有一种更漂亮的方式来表达这些描述,所以如果您有任何想法,请告诉我。

    模型中:

    FIELD_DESCRIPTIONS = {
      'category' => 'Select the category it should appear within.',
      'title' => 'The title should be a short but descriptive summary.',
      'description' => 'Please enter a full description.'
    }
    
    def self.describe_field(field)
      FIELD_DESCRIPTIONS[field]
    end
    

    在application_helper.rb中

    def field_helper(form, field)
      "<span class='field_helper'>#{form.object.class.describe_field(field)}</span>"
    end
    

    鉴于:

    <%= field_helper(f, 'title') %>
    

    这将产生所需的输出:

    <span class='field_helper'>The title should be a short but descriptive summary.</span>
    

    更新:

    好的,这是最后一个代码,我正在使用的基础上接受的答案。

    文件:/config/initializers/descripe\u attr.rb

    if defined?(ActiveRecord)
    
      # let's us add attribute descriptions to each AR model
      class ActiveRecord::Base
        def self.describe_attr(*params)
          attrs = params.shift
          unless attrs.nil?
            case attrs
              when Hash
                @@attr_descriptions = attrs
              when Symbol
                return @@attr_descriptions[attrs]
            end
          end 
          @@attr_descriptions ||= {}
        end
      end
    
    end
    

    文件:/app/models/project.rb

    describe_attr(
        :category => 'Select the category the project should appear within.',
        :title => 'The title should be a short but descriptive summary of the project.',
        :description => 'Describe the project in detail.',
        :image => 'Upload an image for the project.'
    )
    

    文件:/app/helpers/application\u helper.rb

    # assumes you have a style defined for attr_description
    def describe_attr(form, attribute)
        "<span class='attr_description'>#{form.object.class.describe_attr(attribute)}</span>"
    end
    

    文件:/app/views/projects/\u form.html.erb

    <%= describe_attr(f, :title) %>
    
    4 回复  |  直到 15 年前
        1
  •  1
  •   khelll    15 年前

    如果要修补activerecord,可以执行以下操作:

    # Add this at the bottom of enviroment.rb
    class ActiveRecord::Base
      def self.field_description(*params)
        attrs = params.shift
        unless attrs.nil?
          case attrs
            when Hash
              @@field_description = attrs
            when Symbol
              return @@field_description[attrs]
            end
          end 
          @@field_description ||= {}
        end
    end
    

    在模型中,可以像宏一样添加这一行:

    class Product < ActiveRecord::Base
    
      field_description  :category => 'Select the category it should appear within.',:title => 'The title should be a short but descriptive summary.',:description => 'Please enter a full description.'
    
    end
    

    为了得到价值

    Product.field_description : title
    
        2
  •  4
  •   Mat Schaffer    15 年前

    散列是一个合理的简单解决方案,但是如果您使用的是rails 2.2或更高版本,那么您可能希望尝试使用国际化api来实现这一点。如果你想添加翻译,这也会让你处于一个很好的位置。

    退房 the i18n guide 有关详细信息,但基本上您将创建一个config/locales/en.yml,其中包含您的列名,如:

    en:
      labels:
        category: Select the category it should appear within.
    

    那么在你看来:

    <%= t('labels.category') %>
    

    当然,名称空间是您的调用。另请参阅第4.1.4节,了解基于当前视图模板分离翻译的简洁方法。

        3
  •  1
  •   khelll    15 年前

    你可以把你的解决方案和 label 助手本身:

    f.label :title, f.describe(:title)
    

    在你的模型中:

    FIELD_DESCRIPTIONS = {
      :category => 'Select the category it should appear within.',
      :title => 'The title should be a short but descriptive summary.',
      :description => 'Please enter a full description.'
    }
    
    def describe(:field)
      self.class::FIELD_DESCRIPTIONS[field]
    end
    
        4
  •  1
  •   sheldonh    15 年前

    请务必查看formtastic,其中包括根据matschaffer的答案支持国际化(或非国际化)的字段标签。

    http://github.com/justinfrench/formtastic/