覆盖默认的Rails date_select

所以我想要做的是覆盖默认的date_select方法(我想做一个’可选/未指定的’日期输入)。 到目前为止我尝试过的是:

LIB / overrides.rb

ActionView::Helpers::DateHelper::DateTimeSelector.class_eval do def build_selects_from_types(order) select = '' order.reverse.each do |type| separator = separator(type) unless type == order.first # don't add on last field select.insert(0, separator.to_s + send("select_#{type}").to_s) end select.insert(0, '

HI!!

') # or whatever... select.html_safe end end

然后我在environment.rb的底部需要’覆盖’但是在启动WEBrick时我收到此错误:

〜/ .rvm / gems / ruby​​-1.9.2-p0 / gems / activesupport-3.0.0 / lib / active_support / dependencies.rb:479:在`load_missing_constant’中:ActionView :: Helpers没有丢失常量DateTimeSelector! (引发ArgumentError)

所以我显然不知道自己在做什么,但至少尝试这似乎是一件合理的事情。

上面的错误似乎暗示它找不到DateTimeSelector类,但我已经看到了〜/ .rvm / gems / ruby​​-1.9.2-p0 / gems / actionpack-3.0.0 / lib / action_view中的代码/helpers/date_helper.rb我认为我的模块层次结构正确。 是因为它是一个私有的Rails类吗?

欢迎任何想法:)

在Ruby中不存在私有类的概念。 课程从不私密。

出错的原因是路径无效。 它应该是

 ActionView::Helpers::DateTimeSelector 

 ActionView::Helpers::DateHelper::DateTimeSelector 

顺便说一句,你要做的事情绝对是一个坏主意。 Ruby赋予您重新打开类和“补丁”方法的能力这一事实并不意味着您应该为这种类型的自定义执行此操作。

你永远不应该把这些机会带到Rails代码库,除非你真的知道你在做什么。 风险是打破依赖于这种方法的事情。

正确的方法是定义一个新的帮助器并构建自己的逻辑。