小编典典

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

ajax

我在用rails3呈现Java脚本时遇到了麻烦(如果相关,我使用JQuery,它工作正常,因为它已在应用程序的许多其他部分中使用)而不是html。

我所拥有的:我认为,我有此链接:

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

首先,我不明白为什么我必须添加: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

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

  respond_to :js, :html

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

format.js { render :layout => false }

但这并没有改变任何东西。我想我缺少了一些东西,但是我真的看不到…

在此先多谢,干杯!

PS:我不知道这是否有帮助,但是在我在链接帮助器中添加:format
=>:js之前,该视图始终呈现为HTML,并且如果我注释了format.html行,则有一个服务器端出现406不可接受的错误。


阅读 215

收藏
2020-07-26

共1个答案

小编典典

我认为问题不在于您的服务器端代码。对我来说一切都很好。它正在呈现的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;
});

这将捕获链接的click事件,向服务器发送请求,该请求应返回您的edit.js.erb文件,然后将其作为脚本执行。

提醒您,要考虑很多安全问题,以及真实性令牌等。但是,这应该使您的警报得以执行,并使您正确完成应用程序。

阅读jQuery的Ajax,以获取更多选项以及有关POSTing数据的详细信息。

希望这可以帮助。

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

2020-07-26