所以我是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
(来自here)
扩展FormBuilder似乎比鸭子打孔更好。有没有其他方法可以做到这一点,不需要直接将FormBuilder类的部分复制到我的自定义部分?
答案 0 :(得分:0)
这里有两个人:
首先,作为铁杆新手,我建议使用Formtastic宝石。 V是轨道中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!