70

I use twitter-boostrap and I'd like to use these radio-buttons in my form. The problem is when I click on any of these buttons, the form is immediately submitted. How to avoid this? I just want to use default buttons like radio-buttons.

from:

<%= form_for @product do |f| %>
    <div class="control-group">
      <%= f.label :type, :class => 'control-label' %>

      <div class="controls">
        <div class="btn-group" data-toggle="buttons-radio">
          <button class="btn">Button_1</button>
          <button class="btn">Button_2</button>
        </div>
      </div>

    </div>

    <div class="form-actions">
      <%= f.submit nil, :class => 'btn btn-primary' %>
      <%= link_to 'Cancel', products_path, :class => 'btn' %>
    </div>
<% end %>

javascript:

// application.js
$('.tabs').button();
mu is too short
  • 426,620
  • 70
  • 833
  • 800
evfwcqcg
  • 15,755
  • 15
  • 55
  • 72
  • 1
    A little late, but what helped me was [Event Object's preventDefault() Method](http://www.w3schools.com/jsref/event_preventdefault.asp). something like `$('.btn').onClick(function(evt){evt.preventDefault();});` – Samveen Sep 16 '15 at 12:38

3 Answers3

179

From the fine HTML5 specification:

A button element with no type attribute specified represents the same thing as a button element with its type attribute set to "submit".

And a <button type="submit"> submits the form rather than behaving like a simple <button type="button"> push-button.

The HTML4 spec says the same thing:

type = submit|button|reset [CI]
This attribute declares the type of the button. Possible values:

  • submit: Creates a submit button. This is the default value.
  • reset: Creates a reset button.
  • button: Creates a push button.

So your <button> elements:

<button class="btn">Button_1</button>
<button class="btn">Button_2</button>

are the same as these (in compliant browsers):

<button type="submit" class="btn">Button_1</button>
<button type="submit" class="btn">Button_2</button>

and any time you hit one of those buttons you'll submit your form.

The solution is to use plain buttons:

<button type="button" class="btn">Button_1</button>
<button type="button" class="btn">Button_2</button>

Some versions of IE default to type="button" despite what the standard says. You should always specify the type attribute when using a <button> just to be sure that you will get the behavior you're expecting.

Josh Kelley
  • 56,064
  • 19
  • 146
  • 246
mu is too short
  • 426,620
  • 70
  • 833
  • 800
  • Nice, I was having so much trouble stopping every button in my ROR forms from submitting to the create action. Thanks so much for clearing this up. – Aaron Sep 19 '14 at 14:06
  • 2
    @Abdul The time wasn't wasted if it taught you to always include the `type` attribute on your ` – mu is too short Sep 07 '15 at 21:29
0

You can use preventDefault() for this

$('.btn').onClick(function(e){
  e.preventDefault();
});

or you can update your html with following code (just add type="button") in button tag

<%= form_for @product do |f| %>
    <div class="control-group">
      <%= f.label :type, :class => 'control-label' %>

      <div class="controls">
        <div class="btn-group" data-toggle="buttons-radio">
          <button class="btn" type="button">Button_1</button>
          <button class="btn" type="button">Button_2</button>
        </div>
      </div>

    </div>

    <div class="form-actions">
      <%= f.submit nil, :class => 'btn btn-primary' %>
      <%= link_to 'Cancel', products_path, :class => 'btn' %>
    </div>
<% end %>
Super User
  • 9,448
  • 3
  • 31
  • 47
0

You can do this directly using rails form helper also by specifying type as an option to "button":

<%= form_for @product do |f| %>
    <div class="control-group">
      <%= f.label :type, :class => 'control-label' %>

      <div class="controls">
        <div class="btn-group" data-toggle="buttons-radio">
          <%= f.button "Button_1", type: "button", class: "btn" %>
          <%= f.button "Button_2", type: "button", class: "btn" %>
        </div>
      </div>

    </div>

    <div class="form-actions">
      <%= f.submit nil, :class => 'btn btn-primary' %>
      <%= link_to 'Cancel', products_path, :class => 'btn' %>
    </div>
<% end %>
vaibhavatul47
  • 2,766
  • 4
  • 29
  • 42