Пример пользовательского конструктора форм rails для списка радиокнопок

Я ищу пример того, как создать собственный построитель форм для списка переключателей, привязанного к объекту, который действует как_дерево. У меня уже есть код, который отображает список переключателей, но я хочу СУШИТЬ его путем рефакторинга в конструкторе форм. Я не могу найти примеров настраиваемого конструктора форм для списков переключателей.

Любые указатели/ссылки будут оценены.


person Damian    schedule 18.10.2009    source источник


Ответы (1)


Предполагая, что вы часто вызываете form_for для этой модели из разных представлений, и каждая форма будет иметь один и тот же набор переключателей. Здесь можно пройти несколькими путями. Однако я не могу сказать, спрашиваете ли вы, как автоматически добавить список переключателей или просто сжать его.

Автоматическое добавление списка переключателей требует немного большего знания внутреннего устройства ActionView, чем я могу поделиться. По сути, вам нужно выяснить, как все отображается, и переопределить метод fields_for в ActionView::Helpers::FormHelper, чтобы он работал правильно. К сожалению, FormBuilders так не работает. Так что проблем будет намного больше, чем пользы.

Лучшим подходом является создание метода, который генерирует все ваши переключатели в вашем пользовательском конструкторе форм. Для простоты в случае изменения мы добавим в модель константу. Я произвольно решил, что это будет хэш, где каждый ключ — это метод атрибута, который вы хотите представить с помощью списка переключателей в формах, а каждое значение — это список допустимых значений для этого атрибута. Это упрощает создание нескольких списков переключателей без необходимости изменения конструктора форм. P.S. Вы также можете использовать хэш для проверки содержимого любого атрибута, связанного с переключателями.

/app/models/example.rb

class Example < ActiveRecord::Base
  ...
  RADIO_BUTTON_HASH = {
    :attribute_a => [:accepted_value_a1, :accepted_value_a2, :accepted_value_a3],
    :attribute_b => [:accepted_value_b1, :accepted_value_b2],
    ...
  }


   def self.radio_buttons_sort(a,b)
     # sort method to ensure that multiple radio buttons lists appear in the order you want
   end

   def self.radio_buttons_sorted
     RADIO_BUTTON_HASH.sort{|a,b| radio_button_sort(a,b)}
   end
   ...
end

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

**/app/helpers/example_helper.rb модуль ExampleHelper

  # the custom FormBuilder
  class ExampleFormBuilder < ActionView::Helpers::FormBuilder    

    # add onkeypress and set maxlength of field to 3 to all text fields
    def radio_button_list(options={})
      Example.sorted_radio_buttons.each do |method,values|
        values.each do |value|
          radio_button(method, value, options)
        end
      end
    end

  end
end

Затем из представления, в которое включен ExampleHelper (выполняется по умолчанию в любом представлении, отображаемом контроллером Example).

<%form_for @example, :builder => ExampleFormBuilder do |f| %>
  ...

  <%=f.radio_button_list %>
<%end%>
person EmFi    schedule 19.10.2009
comment
Спасибо за ответ. Прошлой ночью я потратил несколько часов, пытаясь решить это, пройдя через помощников по рельсам, и в конце концов нашел похожее решение. - person Damian; 19.10.2009
comment
Да, официальная документация не очень полезна по этому вопросу. В краткой версии вы используете пользовательские FormBuilders для переопределения методов FormHelper с вашими параметрами или создаете новые вспомогательные методы. - person EmFi; 19.10.2009