2

レールのビューで宣言されているすべてのフォームに非表示の入力フィールドを追加する方法はありますか? 非表示フィールドには、コントローラーのパブリック プロパティによって渡される値が必要です。基本的に、Webサーバーからの応答として提供されるフォームには、追加の非表示の入力要素が必要です。

どうすればいいですか?何らかの方法で form_for をオーバーライドできますか? または、パーシャルでフォームのラッパーを使用して、全員にパーシャルを使用するように強制できますか?

4

1 に答える 1

4

編集: わかりました、後でコントローラーから渡すイニシャライザーで値を定義できないため、これに対する私の最初のパスは機能しませんでした。したがって、この 2 つの方法のうちの 1 つに進むことができます。クラスを定義できますCustomFormBuilder-初期化子に入れます-

class CustomFormBuilder < ActionView::Helpers::FormBuilder 
  def submit(value, options = {})
    @template.hidden_field_tag(options.delete(:custom_param)) + super
  end
end

次に、:builderオプションをに渡しますform_for

form_for @whatever, builder: CustomFormBuilder

オプションにcustom_paramが含まれているフォームで呼び出すと仮定するとsubmit(value, options)、必要な値で非表示フィールドを挿入するカスタムメソッドによって上書きされます。

代わりに、monkey patch monkey patch FormTagHelper を代わりに使用します。

module ActionView::Helpers::FormTagHelper

  def extra_tags_for_form_with_custom_param(html_options)
    hidden_field_tag(html_options.delete('custom_param') +
    extra_tags_for_form_without_custom_param(html_options)
  end
  alias_method_chain :extra_tags_for_form, :custom_param
end

form_forこれは、すべてのフォームの上部に認証トークンを挿入するために使用するコードを調整することです。form_forこれで、コントローラーでインスタンス変数として設定した後、そのカスタム パラメーターを に渡すことができます。

form_for @object, custom_param: @custom_param do |f|

Ruby 2.0+ を使用している場合は、非推奨の alias_method_chain の代わりにモジュール prepend を使用できます。

module CustomParamFormPatch
  private
  def extra_tags_for_form(html_options)
    hidden_field_tag(html_options.delete('custom_param')) +
    super
  end
end

ActionView::Base.prepend(CustomParamFormPatch)
于 2013-07-27T05:05:11.410 に答える