Использование построителя форм 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
Другие вопросы по тегам