2

所以我是 Rails 的新手,我试图弄清楚添加自定义表单元素的规范方法是什么。目前我这样做的方式非常糟糕。

module ActionView
  module Helpers
    module FormOptionsHelper
      def some_new_field(object, method, options = {}, html_options = {})
          #code code
      end
    end
    class FormBuilder 
      def contract_year_select(method, options = {}, html_options = {})
        @template.some_new_field(@object_name, method, objectify_options(options), @default_options.merge(html_options))
      end
    end
  end
end

然而,我已经看到了这一点。

class Forms::ApplicationFormBuilder < ActionView::Helpers::FormBuilder
  Forms::ApplicationHelper.instance_methods.each do |selector|
    src = <<-end_src
      def #{selector}(method, options = {})
        @template.send(#{selector.inspect}, @object_name, method, objectify_options(options))
      end
    end_src
    class_eval src, __FILE__, __LINE__
  end

  private

  def objectify_options(options)
    @default_options.merge(options.merge(:object => @object))
  end
end

(从这里

扩展 FormBuilder 似乎是一个比鸭子打孔更好的解决方案。有没有其他方法可以做到这一点,不需要直接将 FormBuilder 类的一部分复制到我的自定义类中?

4

1 回答 1

0

两人在这里:

首先,作为 Rails 新手,我建议使用 Formtastic gem。V 是 Rails 中 MVC 被滥用和忽视的部分。

Formtastic 经过了很好的测试,并且支持 Rails 3

https://github.com/justinfrench/formtastic

使用 Formtastic,您可以创建自定义元素来扩展其出色的类,并获得除了简单的字段显示之外的许多其他好处。

其次,扩展课程绝对是可以接受的。我更喜欢 Module 方法,因为它更容易查看。像这样的东西:

module Forms::ApplicationFormBuilder
 class WhateverYourExtending
  def some_special_method(stuff)
   # all kinds of special stuff here
  end
 end
end

但我几乎不知道我在说什么……这东西就在我理解的边缘。

刚刚看到你在谈论表格,我喜欢 Formtastic!

于 2010-12-30T06:19:20.027 回答