simple_form
Rails4

simple_form にて disable_with: をデフォルトで設定したい

More than 3 years have passed since last update.

背景

フォームの二重送信、できるだけ避けたいですよね。

rails では submit ボタンに data: {disable_with: "送信中..."} というオプションを指定してやることによって、二重送信を防ぐことができます。

= simple_form_for(...) do |f|
  ...
  = f.submit class: "btn btn-primary", data: {disable_with: "送信中..."}

そうすると submit 時はこんな感じに非活性になってくれます。

スクリーンショット 2014-09-03 19.47.37.png

これで二重送信が防げます。やったね。

問題

もちろん、全ての 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: "アップロード中..."}