背景
フォームの二重送信、できるだけ避けたいですよね。
rails では submit ボタンに data: {disable_with: "送信中..."}
というオプションを指定してやることによって、二重送信を防ぐことができます。
= simple_form_for(...) do |f|
...
= f.submit class: "btn btn-primary", data: {disable_with: "送信中..."}
そうすると submit 時はこんな感じに非活性になってくれます。
これで二重送信が防げます。やったね。
問題
もちろん、全ての submit ボタンに対してオプション指定なんかはしたくないので、デフォルトで用意してあげたいですね。
実装例
SimpleForm::FormBuilder
をオープンしてエイリアスメソッドを定義してあげます。
config/initializers/simple_form.rb
SimpleForm::FormBuilder.class_eval do
def submit_with_override(value=nil, options={})
value, options = nil, value if value.is_a?(Hash)
data_disable_with = { disable_with: '送信中...' }
options[:data] = data_disable_with.merge(options[:data] || {})
submit_without_override(value, options)
end
alias_method_chain :submit, :override
end
文言を変えたい場合は、通常通りオプション指定してやるとデフォルト文言を上書きできます。
= simple_form_for(...) do |f|
...
= f.submit class: "btn btn-primary", data: {disable_with: "アップロード中..."}