2
所以我是Rails的新手,我試圖找出添加自定義表單元素的規範方法。目前我做這件事的方式非常糟糕。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類的一部分複製到我的自定義類中?
我第一次看到術語鴨子打孔。我喜歡它! – 2010-02-02 18:44:22
來自Patrick Ewing的一句名言:「那麼,我剛剛完全被亞當賣出,這個想法是,如果它像鴨子一樣走路,像鴨子一樣說話,它就是一隻鴨子,對吧?所以如果這隻鴨子沒有給你你想要的噪音,你必須打鴨子,直到它恢復你的期望。「 – baudtack 2010-02-02 20:33:09