Rails Ajax:.js.erb呈现为文本,而不是JS

Elh*_*lhu 6 ajax jquery ruby-on-rails

我在使用rails3来渲染Javascript时遇到了麻烦(如果这是相关的,我使用JQuery,它可以正常工作,因为它在应用程序的许多其他部分中使用)而不是html.

我有什么:我认为,我有这个链接:

<%= link_to 'Edit', edit_user_repreneur_path(@user_repreneur, :format => :js), :remote => true %>
Run Code Online (Sandbox Code Playgroud)

首先,我真的不明白为什么我要添加:format =>:js来让控制器使用JS视图,而不是HTML视图.这是控制器的代码:

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

在控制器类的开头,我有这一行:

  respond_to :js, :html
Run Code Online (Sandbox Code Playgroud)

我的edit.js.erb文件包含一行警告.但是,在呈现页面时,JS将呈现为文本,因此不会执行.我试图将format.js行更改为

format.js { render :layout => false }
Run Code Online (Sandbox Code Playgroud)

但它没有改变任何东西.我想我错过了什么,但我真的不明白...

非常感谢,欢呼!

PS:我不知道这是否有用,但在我的链接助手中添加:format =>:js位之前,视图总是呈现为HTML,如果我评论了format.html,我有一个406服务器端无法接受错误.

Cha*_*ell 13

我认为问题不在于您的服务器端代码.这对我来说都很好看.它渲染的edit.js.erb事实证明您的服务器端代码工作正常.

问题出在您的客户端.当它收到Ajax响应时,它不会以javascript的形式执行它.它正在以文本形式执行它.

我自己最近遇到过这个问题,我希望自己有代码,但是我在工作.但是,我个人编写了jQuery Ajax请求而不是依赖,:remote => true因为该选项主要用于表单.

尝试给你link_to一个id,然后把这个jQuery放在你application.js或任何地方.

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

这将获取链接的单击事件,向服务器发送请求,该服务器应该返回您的edit.js.erb文件,然后以脚本的形式执行它.

请注意,需要考虑许多安全问题以及真实性令牌等.但是,这应该让您的警报执行并让您走上完成应用程序的正确道路.

阅读jQuery的Ajax,了解有关POST数据的更多选项和详细信息.

希望这可以帮助.

更新:其他可能的解决方案包括使用UJS作为Javascript驱动程序.您可以在https://github.com/rails/jquery-ujs上阅读文档,并查看关于使用UJS的Unobtrusive Javascript主题的Railscast .