Rails 3 - Javascript :confirm not working for link_to and button_to with :method => :delete

Don Leatham picture Don Leatham · Feb 14, 2011 · Viewed 12.1k times · Source

In my index.html.erb file I'm trying to display the title to my object (a "listing") and the normal "show", "edit", and "destroy" links and/or buttons. With :method => :delete and :confirm => "are you sure?", neither link_to or button_to will present the javascript confirmation box. Here is my index.html.erb:

<h2><a href="#" onclick="alert('Hello world!'); return false;">Click Here for a Javascript test</a></h2>   
<table>  
  <tr>
    <th>List Title</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>    
<% @listings.each do |listing| %>
  <tr>
    <td><%= listing.title %></td>
    <td><%= button_to 'Show', listing %></td>
    <td><%= button_to 'Edit', edit_listing_path(listing) %></td>
    <td><%= button_to( 'Destroy', listing, 
                       :confirm => 'Are you sure?', :method => :delete)%> </td>
    <td><%= link_to "Destroy", listing, :confirm => "Are you sure?", :method => :delete %> </td>
  </tr>
<% end %>
</table>

The "Hello World" JS confirmation link at the top of the listing works perfectly, so I'm pretty sure that unobtrusive javascript is working fine for my app. (I also confirmed I have the necessary-- javascript_include_tag :defaults and csrf_meta_tag are in my application template.) The Rails documentation confirms the arguments that I'm using are supported (url, :confirm, :method). However neither button_to or link_to will generate the JS alert indicated by :confirm. One other bit of strangeness, with the exact same arguments, button_to will delete a record while link_to does not.

Any suggestions on what to investigate to fix this would be appreciated.

Thanks!

Answer

Jordan T. Cox picture Jordan T. Cox · Feb 14, 2011

I ran into this exact issue before when I was accidentally including both Prototype and jQuery. Check the resources that are getting loaded to ensure that you're not loading both frameworks somehow.