2013-09-21 87 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}}