【问题标题】:Overriding default Rails date_select覆盖默认 Rails date_select
【发布时间】:2010-10-24 09:17:23
【问题描述】:

所以我想做的是覆盖默认的 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/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:479:in `load_missing_constant': ActionView::Helpers 不缺 常量日期时间选择器! (参数错误)

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

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

欢迎任何想法:)

【问题讨论】:

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


    【解决方案1】:

    在 Ruby 中不存在私有类的概念。课程永远不会是私人的。

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

    ActionView::Helpers::DateTimeSelector
    

    不是

    ActionView::Helpers::DateHelper::DateTimeSelector
    

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

    除非您真的知道自己在做什么,否则您永远不应该在 Rails 代码库中使用这些机会。风险在于破坏依赖于这种方法的东西。

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

    【讨论】:

    • 糟糕,是的,我错过了 DateHelper 模块的结尾。我很高兴它没有奏效,因为这意味着我在这里提出了这个问题,并让你有机会告诉我这是一个愚蠢的想法:)
    • 这似乎是个好主意,因为有很多优秀的代码,我只需要稍微调整一下。我绝对同意你的观点,我想我可以重复使用某些方法,所以我不必完全重新发明日期选择轮。谢谢西蒙娜。
    • @Jerome 助手被创建为一个类。您始终可以创建一个类并从 DateTimeSelector 继承,这样您将拥有所有原始方法,并且您可以轻松地覆盖它们而不影响原始源。
    • 再次感谢西蒙妮。信不信由你,我已经是一名相当熟练的 C# 程序员了,但是很多 Rails 的东西仍然感觉像是黑魔法,尽管许多核心概念是相同的,当然 :)
    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 2011-12-28
    • 1970-01-01
    • 2011-01-30
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多