2010-10-24 2 views
1

Итак, что бы я хотел сделать, это переопределить метод date_select по умолчанию (я бы хотел ввести «необязательный/неуказанный» ввод даты). То, что я пытался до сих пор это:Переопределение по умолчанию Rails date_select

Библиотека/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 is not missing constant DateTimeSelector! (ArgumentError)

Таким образом, я, очевидно, не знаю, что я делаю, но это кажется разумной попыткой хотя бы по крайней мере.

Ошибка, указанная выше, означает, что она не может найти класс DateTimeSelector, но я просмотрел код в ~/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0 /lib/action_view/helpers/date_helper.rb, и я думаю, что у меня правильная иерархия модулей. Это потому, что это частный класс Rails?

Любые мысли приветствуется :)

ответ

4

В Ruby не существует понятие частного класса. Классы никогда не являются частными.

Причина ошибки в том, что путь недействителен. Он должен быть

ActionView::Helpers::DateTimeSelector 

не

ActionView::Helpers::DateHelper::DateTimeSelector 

BTW, что вы пытаетесь сделать, это абсолютно плохая идея. Тот факт, что Ruby дает вам возможность повторного открытия классов и методов «патча», не означает, что вы должны делать это для таких настроек.

Вы никогда не должны делать эти шансы на кодовую базу Rails, если вы действительно не знаете, что делаете. Риск состоит в том, чтобы сломать вещи, которые зависят от этого метода.

Правильный путь - это определить нового помощника и построить свою собственную логику.

+0

К сожалению, я пропустил конец модуля DateHelper. Я рад, что это не сработало, хотя это означало, что я задал этот вопрос здесь и дал вам возможность рассказать мне, что это глупая идея в первую очередь :) – Jerome

+0

Похоже, это хорошая идея, потому что есть много отличного кода и мне просто нужно было настроить крошечный бит. Я абсолютно понимаю вашу точку зрения, и я думаю, что я могу повторно использовать определенные методы, поэтому мне не нужно полностью изобретать колесо выбора даты. Спасибо Simone. – Jerome

+0

@Jerome Помощник создается как класс. Вы всегда можете создать класс и наследовать от DateTimeSelector, чтобы у вас были все оригинальные методы, и вы можете легко переопределить их, не затрагивая исходный источник. –

Смежные вопросы