Предполагая, что вы часто вызываете 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