32

我正在 Rails 中构建一个表单,它将通过 ajax 编辑现有问题。

提交表单并更新问题后,控制器中的 update 方法会渲染 update.js.erb,这将再次隐藏表单。

我的问题是 update.js.erb 中的 javascript 代码根本没有执行。

我知道该文件正在呈现,因为它显示在服务器输出中,并且当我放一个

<% raise params %>

进入它,它的工作原理。

然而,即使是最简单的

alert('hello');

在同一个文件中没有效果。

我已经排除了 javascript 和 jquery 配置问题,因为相同的代码在我的 edit.js.erb 文件中完美运行。它只是在 update.js.erb 中不起作用。

我错过了什么?

编辑:

Firebug 没有显示错误。这是萤火虫的网络面板中的响应:

alert('hello');
$('#question_body').replaceWith('<h4><p>jhsdfjhdsb k jdfs j fjfhds <strong>jfshaflksd;hf sdldfs l fdsalkhdfskhdfs</strong>;fd lfdksh hfdjaadfhsjladfhsjadfs ;df sjldfsj dfas hafdsj fdas ;ldfas ldfs df dl;hdf fdh ;fdj ;lfads</p></h4>');

定义更新

编辑2:

这是控制器动作:

def update
  respond_to do |format|
    if @question.update_attributes(params[:question])
      format.html { redirect_to @question, :flash => { :success => 'Question was successfully updated.' } }
      format.json { head :no_content }
      format.js {}
    else
      format.html { render action: "edit" }
      format.json { render json: @question.errors, status: :unprocessable_entity }
    end
  end
end
4

7 回答 7

53

在您的$.ajax调用中,请确保将dataType选项设置为,"script"否则响应可能会以其他方式解释,因此不会作为 JS 执行。

于 2013-12-31T01:07:08.717 回答
38

您使用haml 还是html.erb?如果是前者,那么这可能是解决方案:

respond_to do |format|
  ...
  format.js {render layout: false}
end

我遇到了完全相同的问题,很早就发现了这个问题,又花了一个小时左右的谷歌搜索在 StackOverflow 上找到了这个问题,这让我找到了这个问题:jQuery + Ajax + Haml。js.erb 文件未触发

于 2013-12-29T23:19:56.620 回答
4

在您的 update.js.erb 文件中,您需要在执行 ruby​​ 代码的任何地方转义 javascript。

$('.container').empty().append('<%=
  escape_javascript(
    render 'update'
  )
%>')

这就是为我解决它的...

于 2014-04-08T19:09:02.663 回答
2

这个问题不仅仅是因为控制器方面。也可以在视图方面,即您没有阐明发布请求的数据类型。

确保在您的控制台中将请求视为JS

参考: 类似问题

于 2014-08-08T07:29:59.823 回答
1

我遇到了同样的问题并找到了这个页面。我尝试了此处列出的方法,但没有找到运气。后来以下方法解决了我的问题。

我最初的代码是:

$('#html_id').html('<%=@ruby_variable%>');

我将其更新为:

$('#html_id').html('<%=raw @ruby_variable.to_json%>');

现在它按预期工作。

于 2015-04-02T17:27:53.607 回答
0

另一个需要注意的问题是 update.js 文件中的错误。如果有任何语法错误,则不会执行任何操作。您可以通过转到浏览器检查器并启用Log XMLHttpRequests然后查看输出 js 文件来检查这一点。

于 2019-07-19T16:33:44.390 回答
0

发现它是什么!(轨道 4 的解决方案)

如果您的 ajax 调用参数不在您的允许列表中,则记录将被保存,您不会收到有关“不允许”参数的错误消息,但 update.js.erb 不会运行 - 即使您的终端将反馈“渲染的 update.js.erb 等”

如果额外参数是模型中的属性,则允许它。

允许非模型参数的最简单方法是在模型中添加:

  attr_accessor :paramKeyTroublesome

然后你也可以在控制器中允许它。

在 $ajax 调用中,需要正确地散列数据:

  data: {model_name: {paramKey1: value, paramKeyTroublesome: value}}
于 2017-07-16T03:13:13.803 回答