Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
708 views
in Technique[技术] by (71.8m points)

jquery - Rails Ajax: .js.erb rendered as text, not JS

I'm having a trouble with rails3 to render Javascript (If this is relevant, I use JQuery and it works fine since it's used in numerous other parts of the application) instead of html.

What I have: I a view, I have this link:

<%= link_to 'Edit', edit_user_repreneur_path(@user_repreneur, :format => :js), :remote => true %>

First of all, I don't really get why I have to add :format => :js to get the controller to use the JS view, and not the HTML one. Here is the code of the controller:

def edit
    @user_repreneur = UserRepreneur.find_by_id_view(params[:id])
    respond_to do |format|
      format.js
      format.html
    end 
end

At the beginning of the controller class, I have this line:

  respond_to :js, :html

My edit.js.erb file contains a single line with an alert. However, when rendering the page, the JS is rendered as text, and therefore is not executed. I tried to change the format.js line to

format.js { render :layout => false }

But it doesn't change anything. I guess I am missing something, but I really don't see what...

Thanks a lot in advance, cheers!

PS: I don't know if this is helpful, but before I add the :format => :js bit in my link helper, the view was always rendered as HTML, and if I commented the format.html line, I had a 406 Not Acceptable error on the server side.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I don't think the problem is with your server-side code. It all looks good to me. And the fact that it is rendering edit.js.erb proves that your server-side code is working fine.

The problem is on your client-side. When it receives the Ajax response, it isn't executing it as javascript. It is executing it as text.

I have recently had this problem myself and I wish I had my code with me but I'm at work. However, I personally wrote the jQuery Ajax request instead of relying on :remote => true since that option is mostly used in forms.

Try giving your link_to an id and then put this jQuery in your application.js or wherever.

$('#link_id').click(function(){
   $.ajax({
      type : 'GET',
      url : '/:controller/:action/',
      dataType : 'script'
   });
   return false;
});

This will grab the link's click event, send a request to the server which should return your edit.js.erb file, and then execute it as script.

Mind you, there is a lot of security concerns to take into account as well as authenticity tokens and the like. However, this should get your alert to execute and get you on the right path to completing your app.

Read up on jQuery's Ajax for further options and details about POSTing data as well.

Hope this helps.

UPDATE: Other possible solutions include using UJS as a Javascript driver. You can read the documentation at https://github.com/rails/jquery-ujs and view a Railscast on the topic Unobtrusive Javascript using UJS.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...