2011-03-15 36 views
5

我在使用rails3渲染Javascript時遇到了麻煩(如果這是相關的,我使用JQuery並且它工作正常,因爲它在應用程序的許多其他部分中使用)而不是html。Rails Ajax:.js.erb呈現爲文本,而不是JS

我有什麼: 我一看,我有此鏈接:

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

首先,我真的不明白爲什麼我要補充:格式=>: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 } 

但它不會改變任何東西。 我想我失去了一些東西,但我真的不知道什麼...

非常感謝,歡呼!我不知道這是否有幫助,但在我的鏈接助手中添加:format =>:js位之前,視圖總是以HTML格式呈現,如果我評論了format.html行,我在服務器端出現了406 Not Acceptable錯誤。

+0

它確實是通過ajax請求發送的嗎?你可以檢查控制檯或螢火蟲控制檯 – 2011-03-15 11:58:31

+0

在控制器的開始部分有respond_to:js,:html意味着你期望在你的動作中使用respond_with(而不是respond_to)。我想知道這個冗餘是否會導致問題 - 你是否嘗試擦除控制器中的第一行?您也不需要在視圖中添加:format =>:js – 2011-03-15 12:08:49

+0

在Chrome控制檯中,當我點擊鏈接時,我看到一個GET請求,其中包含304響應代碼和文本/ JavaScript類型。 此外,評論控制器中的行不會改變任何東西,但感謝您的信息:)! 我知道我不應該需要在視圖中指定格式,但否則它總是呈現HTML ...奇怪。 – Elhu 2011-03-15 12:13:33

回答

10

我不認爲問題出在你的服務器端代碼上。這一切對我來說都很好。事實上,它是渲染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; 
}); 

這會搶了鏈接的點擊事件,發送到應返回你的edit.js.erb文件服務器發出請求,然後執行它的腳本。

請注意,考慮到許多安全問題以及真實性令牌等。但是,這應該讓您警覺執行並使您找到完成應用的正確途徑。

請閱讀jQuery's Ajax以獲取關於發佈數據的更多選項和詳細信息。

希望這會有所幫助。

更新:其他可能的解決方案包括使用UJS作爲Javascript驅動程序。您可以閱讀文檔https://github.com/rails/jquery-ujs,並使用UJS查看有關主題Unobtrusive Javascript的Railscast。

+0

這工作,非常感謝。 但是,我不明白爲什麼我必須使用這樣的技巧...... 和爲什麼:remote => true在鏈接上看起來沒有正常工作。 – Elhu 2011-03-15 13:16:02

+0

我一直在琢磨那很多我自己。就像我說的,我更加手工編碼所有的Javascript,但是我發現了一些可以幫助你的資源,並相應地更新了我的答案。 – 2011-03-15 14:03:45

+0

你應該在我的問題的評論中看看tommasop提出的問題。這似乎是一個愚蠢的事情來檢查,但它解決了我的問題。 – Elhu 2011-03-15 14:05:06

1

似乎有點晚,提供這個答案,但更好的遲到永遠不會。

您正在混合respond_to和respond_with。在控制器類的頂部使用respond_to:js,:html。那麼把它放進你的編輯操作

def edit 
    @user_repreneur = UserRepreneur.find_by_id_view(params[:id]) 
    respond_with @user _repreneur 
end 
1

js.erb文件呈現爲文本,如果你不具備jquery_ujs庫包含在您的application.js文件:

//= require jquery 
//= require jquery_ujs 

而且你需要在你的Gemfile以下的寶石:

gem 'jquery-rails' 
gem 'jquery-ui-rails' 
相關問題