0

ヘルパーの代わりとして 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
  ...

もっとエレガントな方法はありますか?

4

1 に答える 1

0

これに対するややエレガントな解決策を見つけたと思います。次のモジュールを作成し、デコレーターに混ぜました。

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
于 2014-12-13T02:52:06.797 に答える