Rails update.js.erb没有执行javascript

时间:2013-09-21 19:21:31

标签: javascript jquery ruby-on-rails ajax ruby-on-rails-3

我正在使用rails构建一个表单,该表单将通过ajax编辑现有问题。

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

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

我知道该文件正在渲染,因为它显示在服务器输出中,当我放入

<% raise params %>

进入它,它有效。

然而,即便是最简单的

alert('hello');

在同一个文件中无效。

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

我错过了什么?

修改:

Firebug没有显示任何错误。以下是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>');

def update

编辑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

7 个答案:

答案 0 :(得分:48)

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

答案 1 :(得分:35)

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

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

我遇到了完全相同的问题,很早就发现了这个问题,花了一个小时左右的谷歌搜索在StackOverflow上找到了这个导致我的问题:jQuery + Ajax + Haml. js.erb files not firing

答案 2 :(得分:4)

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

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

这就是为我解决的问题......

答案 3 :(得分:2)

此问题不仅仅是因为控制器方面。它也可以在查看方面,但您没有说明您的帖子请求的数据类型。

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

参考:Similar issue

答案 4 :(得分:1)

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

我原来的代码是:

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

我将其更新为:

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

现在它按预期工作。

答案 5 :(得分:0)

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

如果您的ajax调用参数不在允许列表中,则记录会被保存,您不会收到有关“不允许”参数的错误消息,但update.js.erb将无法运行 - 甚至虽然您的终端将反馈'Rendered update.js.erb etc'

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

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

  attr_accessor :paramKeyTroublesome

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

在$ ajax调用中,

需要正确地对数据进行整理:

  data: {model_name: {paramKey1: value, paramKeyTroublesome: value}}

答案 6 :(得分:0)

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