button_to(name, options = {}, html_options = {}) public

Generates a form containing a single button that submits to the URL created by the set of options. This is the safest method to ensure links that cause changes to your data are not triggered by search bots or accelerators. If the HTML button does not work with your layout, you can also consider using the link_to method with the :method modifier as described in the link_to documentation.

By default, the generated form element has a class name of button_to to allow styling of the form itself and its children. This can be changed using the :form_class modifier within html_options. You can control the form submission and input element behavior using html_options. This method accepts the :method and :confirm modifiers described in the link_to documentation. If no :method modifier is given, it will default to performing a POST operation. You can also disable the button by passing :disabled => true in html_options. If you are using RESTful routes, you can pass the :method to change the HTTP verb used to submit the form.


The options hash accepts the same options as url_for.

There are a few special html_options:

  • :method - Symbol of HTTP verb. Supported verbs are :post, :get, :delete and :put. By default it will be :post.

  • :disabled - If set to true, it will generate a disabled button.

  • :confirm - This will use the unobtrusive JavaScript driver to prompt with the question specified. If the user accepts, the link is processed normally, otherwise no action is taken.

  • :remote - If set to true, will allow the Unobtrusive JavaScript drivers to control the submit behavior. By default this behavior is an ajax submit.

  • :form - This hash will be form attributes

  • :form_class - This controls the class of the form within which the submit button will be placed


<%= button_to "New", :action => "new" %>
# => "<form method="post" action="/controller/new" class="button_to">
#      <div><input value="New" type="submit" /></div>
#    </form>"

<%= button_to "New", :action => "new", :form_class => "new-thing" %>
# => "<form method="post" action="/controller/new" class="new-thing">
#      <div><input value="New" type="submit" /></div>
#    </form>"

<%= button_to "Create", :action => "create", :remote => true, :form => { "data-type" => "json" } %>
# => "<form method="post" action="/images/create" class="button_to" data-remote="true" data-type="json">
#      <div><input value="Create" type="submit" /></div>
#    </form>"

<%= button_to "Delete Image", { :action => "delete", :id => @image.id },
          :confirm => "Are you sure?", :method => :delete %>
# => "<form method="post" action="/images/delete/1" class="button_to">
#      <div>
#        <input type="hidden" name="_method" value="delete" />
#        <input data-confirm='Are you sure?' value="Delete" type="submit" />
#      </div>
#    </form>"

<%= button_to('Destroy', 'http://www.example.com', :confirm => 'Are you sure?',
          :method => "delete", :remote => true, :disable_with => 'loading...') %>
# => "<form class='button_to' method='post' action='http://www.example.com' data-remote='true'>
#       <div>
#         <input name='_method' value='delete' type='hidden' />
#         <input value='Destroy' type='submit' disable_with='loading...' data-confirm='Are you sure?' />
#       </div>
#     </form>"
Show source
Register or log in to add new notes.