覆盖默认的Rails date_select

时间:2010-10-24 09:17:23

标签: ruby-on-rails ruby ruby-on-rails-3 datepicker override

所以我想要做的是覆盖默认的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类吗?

欢迎任何想法:)

1 个答案:

答案 0 :(得分:4)

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

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

ActionView::Helpers::DateTimeSelector

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

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

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