2013-09-21 51 views
24

我正在用Rails编写一个窗体,它将通过ajax编辑现有的问题。Rails update.js.erb没有执行javascript

提交表单并且问题已更新后,控制器中的更新方法会呈现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 
+0

结帐在Firebug的网络面板的响应。它显示了什么? – Arjan

+0

添加了对问题的回复。谢谢参观。 – dmanaster

+0

显示您是否在表单中创建了ajax?例如,如果你只是调用$ .ajax(..),但是对响应什么也不做将会被执行,与例如使用jQuerys getScript(http://api.jquery.com/jQuery.getScript/)相反 – trueunlessfalse

回答

32

你与HAML工作,或html.erb?如果是前者,那么这可能是解决办法:

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

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

+2

'''{render layout:false}'''为同样的问题浪费了我3个小时。添加后,它工作正常。 Thaks – przbadu

+0

经过几天的努力,这对我有效:)谢谢 – Herm

+0

也在这里工作。但是为什么我需要'render layout:false'在这里?我已经在控制器文件的顶部指定了一个布局。我已经在几个地方使用了完全相同的模式(通过'remote:true'提交并在'create.js.erb'中修改页面),而之前未使用'render layout:false'。 – Sasgorilla

38

在您的通话$.ajax请务必设置dataType选项"script"否则反应可能用其他方式来解释,因此不能作为JS执行。

+0

惊人的工作非常感谢的人 –

+0

希望我可以不止一次地upvote这个。 – cubsker

+0

谢天谢地,你救了我的一天。 – mainframer

4

在你的update.js.erb文件中,无论你在哪里执行ruby代码,都需要转义javascript。

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

这就是解决了这个问题对我来说...

+3

您也可以使用'j'来转义javascript。例如:'$('。container')。html(“<%= j render'update'%>”);' –

2

这个问题只是因为控制器侧没有。它也可以在查看这是你没有说明你的发布请求的数据类型。

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

参考:Similar issue

1

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

我最初的代号是:

$('#html_id').html('<%[email protected]_variable%>'); 

,我又把它更新为:

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

现在按预期工作。

+0

耶稣,你是对的。任何想法为什么它默默地失败而不是抛出一个错误? – michaelsking1993

0

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

如果您的ajax调用参数不在允许列表中,那么记录会被保存,您将不会收到关于'不允许'参数的错误消息,但会得到update.js。 erb将不会运行 - 即使您的终端将反馈“Rendered update.js.erb etc”

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

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

attr_accessor :paramKeyTroublesome 

那么你也可以允许它在控制器中。

在$ Ajax调用

,数据需要正确地散列起来:

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