レールのビューで宣言されているすべてのフォームに非表示の入力フィールドを追加する方法はありますか? 非表示フィールドには、コントローラーのパブリック プロパティによって渡される値が必要です。基本的に、Webサーバーからの応答として提供されるフォームには、追加の非表示の入力要素が必要です。
どうすればいいですか?何らかの方法で form_for をオーバーライドできますか? または、パーシャルでフォームのラッパーを使用して、全員にパーシャルを使用するように強制できますか?
レールのビューで宣言されているすべてのフォームに非表示の入力フィールドを追加する方法はありますか? 非表示フィールドには、コントローラーのパブリック プロパティによって渡される値が必要です。基本的に、Webサーバーからの応答として提供されるフォームには、追加の非表示の入力要素が必要です。
どうすればいいですか?何らかの方法で form_for をオーバーライドできますか? または、パーシャルでフォームのラッパーを使用して、全員にパーシャルを使用するように強制できますか?
編集: わかりました、後でコントローラーから渡すイニシャライザーで値を定義できないため、これに対する私の最初のパスは機能しませんでした。したがって、この 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)