form_tag not passing a js call in Rails3

This seems like it should be pretty straightforward, but its stumping
me. I have a small form that I am trying to submit using jquery that
is supposed to remove an association between to HABTM models. For the
sake of argument, the models are Course and Student.

# view
     <%= form_tag ( remove_student_from_course_path, :remote => true )
%>
        <%= hidden_field_tag "course_id", @course.id %>
        <%= hidden_field_tag "student_id", @student.id %>
     <%= submit_tag 'Remove' %>

# controller
  def remove_student_from_class
    @student = Student.find(params[:student_id])
    @msg = Factor.method_to_remove_student_from_class(params)

    respond_to do |format|
        format.html { redirect_to edit_class_path(@class) }
        format.js
    end
  end

# remove_student_from_class.js.erb
// reload the page
location.reload();

Everything works fine, except the HTML code is generated and not the
JS code in the respond_to block. I would expect the JS call to get
fired since I have the ':remote => true' line in there, but its always
the HTML and it generates the page. What am I overlooking?

Dave

Are you including rails.js?

Yes I am, here's what I have in the application.html.erb view, and
they are all in my javascript folder

<%= javascript_include_tag 'jquery-1.4.3.js', 'rails', 'application'
%>

Yes I am, here's what I have in the application.html.erb view, and
they are all in my javascript folder

<%= javascript_include_tag 'jquery-1.4.3.js', 'rails', 'application'
%>

Ah, but have you replaced rails.js with the jquery version?

curl -O https://github.com/rails/jquery-ujs/raw/master/src/rails.js

see the README at http://github.com/rails/jquery-ujs for more details.

-Rob

Yep, i've done that, too. Here's the header of the 'rails.js' version
i'm using

/*
* jquery-ujs

Do you have anything pertinent/related/involved in the application.js
file? Try pulling that out as you could be having a failure in JS
that's causing grief. Also -- check your console in Firebug (or
whatever you're using) and see if errors are being thrown when the
page loads.

Nope, nothing in the application.js file. Checked the firebug output
and there is nothing. The JS is not even getting fired, which make no
sense because I have the ':remote => true' statement in there. It
even creates the 'data-remote' call in the HTML output (see below). I
thought that was the key to UJS in Rails3?

<form accept-charset="UTF-8" action="/course/
remove_student_from_course" data-remote="true" method="post"><div
style="margin:0;padding:0;display:inline"><input name="utf8"
type="hidden" value="&#x2713;" /><input name="authenticity_token"
type="hidden" value="4uzcKHN73cndlQENeb7IWRhe6g0F5eFZG91y3ACWO0M=" /></

        <input id="course_id" name="course_id" type="hidden"
value="1529" />
        <input id="student_id" name="student_id" type="hidden"
value="437" />
        <input class="submitLink" name="commit" type="submit"
value="Remove" />
      </form>

I'm sure you checked this but just in case... based on what you just
said, check to make sure you haven't disabled JS in your browser.
Put a "Hello World" script in Application.js

I'm using jQuery in Rails 3 with Ruby 1.9.2 and it's working fine:

I use <%= javascript_include_tag :default %> with :default defined as

    config.action_view.javascript_expansions[:defaults] =
%w(jquery.min rails jquery-ui.min)

in my application.rb file.

HTH,
Dan

Yep, Javascript is enabled, and working fine. Apparently, I have
stumped the brightest minds in the rails world :slight_smile: That can only mean
one thing...i'm overlooking something very simple and I'll feel quite
dumb when the answer is presented to me :slight_smile:

Show is what is in the log when you do the submit.

Colin

The problem appears to be the dataType of the Ajax request -- it is
requesting an HTML response rather than a script. I wonder if the
default has changed recently?

Anyway, calling

     $.ajaxSetup({ dataType: 'script' });

at the top of your application.js or similar will change the default and
appears to restore the expected behaviour. You could also set the
data-type="script" attribute on your <form> or <a> tags.

I'm having exactly the same issues as the original poster, and have
checked all the settings mentioned above, and it's still not working.

I tried adding the $.ajaxSetup({ dataType: 'script' }); to my
application.js, and data-type="script" to my form, and it didn't help.

Any other ideas? Thanks...

I found the answer (at least for me)!

The issue is described here:

https://github.com/rails/jquery-ujs/issues/issue/52

More info here on the official fix:

https://github.com/rails/jquery-ujs/commit/fbbefa0773d791d3a67b7a3bb971c10ca750131b

The solution was to add a line of jQuery to set the proper request
header to handle Ajax calls. In my
app/views/layouts/application.html.erb, just add this after you include
the jQuery file:

<script type="text/javascript">
  jQuery.ajaxSetup({
    beforeSend: function (xhr) {
      xhr.setRequestHeader("Accept", "text/javascript");
    }
  });
</script>

Are you using rails.js?

https://github.com/rails/jquery-ujs/blob/v1.4/src/rails.js