Предполагая, что вы часто вызываете 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%>
Спасибо за ваш ответ. Я провел несколько часов, пытаясь разобраться с прошлой ночью, пройдя через помощников рельсов и в итоге получив подобное решение. – Damian
Да, официальная документация не очень полезна по этому вопросу. В короткой версии вы используете пользовательские FormBuilders для переопределения методов FormHelper с вашими параметрами или создания новых вспомогательных методов. – EmFi