2009-10-18 4 views
0

Я ищу пример создания настраиваемого конструктора форм для списка переключателей, привязанного к объекту act_as_tree. У меня уже есть код, который отображает список радиокнопок, но вы хотите DRY его рефакторинг в formbuilder. Я не могу найти никаких примеров создания пользовательских форм для списков переключателей.Пример настраиваемого формообразователя для рельсов для списка радиобуров

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

ответ

2

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

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

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

/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 

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

**/приложение/хелперы/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 включен (сделано по умолчанию в любом виде, вынесенным в примере контроллера).

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

    <%=f.radio_button_list %> 
<%end%> 
+0

Спасибо за ваш ответ. Я провел несколько часов, пытаясь разобраться с прошлой ночью, пройдя через помощников рельсов и в итоге получив подобное решение. – Damian

+0

Да, официальная документация не очень полезна по этому вопросу. В короткой версии вы используете пользовательские FormBuilders для переопределения методов FormHelper с вашими параметрами или создания новых вспомогательных методов. – EmFi