Rails автоматически вызывает вспомогательные методы приложения при каждом вызове form_for

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

В моем приложении каждый раз, когда появляется форма, я вызываю два вспомогательных метода, чтобы ввести некоторый javascript в начало веб-страницы. Один метод вводит код, чтобы сосредоточиться на первом вводе формы, а второй метод подключает некоторые обратные вызовы, которые я использую с драгоценным камнем client_side_validation .

Я буду вызывать эти два метода на любой странице, на которой есть form_for в представлении. Есть ли способ автоматически вызывать эти методы при каждом вызове form_for, в отличие от добавления вызовов в мои файлы шаблонов?

Использование Rails 3.1.

Ответ №1:

Вы должны обернуть form_for своим собственным методом, который вызывает ваших помощников. К счастью, Rails предоставляет простой способ сделать это в форме alias_method_chain .

 module ActionView::Helpers::FormHelper
  def form_for_with_my_helpers (*args)
    my_helpers
    form_for_without_my_helpers (*args)
  end
  alias_method_chain :form_for :my_helpers
end
  

Теперь вы можете вызвать form_for_without_my_helpers с обычными аргументами form_for, если вы не хотите, чтобы форма использовала ваши помощники.

Это может быть где-то в пути загрузки. Или вы можете запросить файл, содержащий этот код.

Комментарии:

1. Похоже, что это будет работать отлично. Я не вижу определения для form_for_without_my_helpers — я что-то упускаю? Могу ли я просто сделать alias_method_chain:form_for:my_helpers? Кроме того, куда бы вы порекомендовали поместить этот код? Существует ли соглашение для такого рода вещей?

2. Неважно — документы прояснили, что alias_method_chain заботится об определении и объединении всего, что необходимо. Спасибо!

Ответ №2:

Вы не должны использовать вспомогательные методы Rails для них. Вы должны использовать jQuery. Добавьте это в свой application.js файл:

 $(document).ready(function() {
  $('form>input:first-child').focus();
}
  

Это пример, используйте аналогичный метод для обратных вызовов, о которых вы говорите.

Комментарии:

1. Я использую jQuery через вызов content_for в помощнике. Причина, по которой я использую вспомогательный метод, заключается в том, что я не хочу, чтобы эти скрипты были на каждой отдельной веб-странице. Не то, чтобы это каким-либо образом снижало производительность, но я подумал, зачем включать его на каждую страницу, если он не будет использоваться на большинстве из них. Оцените подсказку в форме> ввод: первый дочерний элемент.