所以我想要做的是覆盖默认的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, '<p>HI!!</p>') # or whatever...
select.html_safe
end
end
然后我在environment.rb底部要求'覆盖'但是在启动WEBrick时我收到此错误:
〜/ .rvm /宝石/红宝石1.9.2-P0 /宝石/的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类吗?
欢迎任何想法:)
答案 0 :(得分:4)
在Ruby中不存在私有类的概念。课程从不私有。
错误的原因是路径无效。它应该是
ActionView::Helpers::DateTimeSelector
不
ActionView::Helpers::DateHelper::DateTimeSelector
顺便说一下,你要做的事情绝对是一个坏主意。事实上,Ruby为您提供了重新打开类和“补丁”方法的能力,这并不意味着您应该为这种类型的自定义执行此操作。
除非你真的知道自己在做什么,否则你永远不应该把这些机会带到Rails代码库。风险是打破依赖于这种方法的事情。
正确的方法是定义一个新助手并构建自己的逻辑。