Использование построителя форм Rails и Draper
Я даю Дрейперу попытку в качестве альтернативы помощникам. Я получаю случаи, когда я просто форматирую информацию. Но как насчет взаимодействия с конструктором форм Rails. Например, если я хотел вывести строку или поле выбора в зависимости от некоторого контекста. Должен ли я передать конструктор форм в качестве аргумента. Итак, в моем декораторе:
def role_or_select form
available_roles = h.policy_scope User::ROLES
if available_roles.include? role
form.input :role, collection: available_roles, include_blank: false
else
role
end
end
Тогда, на мой взгляд:
= simple_form_for user do |form|
...
= user.role_or_select_on form
...
Есть ли более элегантный метод?
1 ответ
Я думаю, что нашел несколько элегантное решение для этого. Я создал следующий модуль и смешал его с моими декораторами:
module FormDecoration
def form options={}, &blk
h.simple_form_for model, options do |builder|
@form_builder = builder
blk[builder]
end
ensure
@form_builder = nil
end
def method_missing meth, *args, &blk
if @form_builder && @form_builder.respond_to?(meth)
@form_builder.public_send meth, *args, &blk
else
super
end
end
def respond_to? meth
(@form_builder && @form_builder.respond_to?(meth)) || super
end
end
Теперь мое мнение может быть таким:
= user.form do
= user.input :name
= user.input :email
= user.role_or_select
input
метод передается в построитель форм. Role_or_select определен в моем помощнике, чтобы выглядеть примерно так:
def role_or_select
available_roles = h.policy_scope User::ROLES
if available_roles.include? object.role
input :role, collection: available_roles, include_blank: false
else
object.role
end
end
Это даже позволяет мне делать такие вещи, как добавление параметров формы в декоратор. Например, добавление следующего в мой UserDecorator отключит автозаполнение:
def form options={}
options[:html] ||= {}
options[:html][:autocomplete] = 'off'
super options
end