2012-08-02 84 views
8

渲染js.erb,我打電話通過AJAX控制器,像這樣:Rails的:通過AJAX調用從JavaScript

$.ajax({ 
    type: 'GET', 
    url: '/books' 
} 

在我的控制,我有:

def index 
    render 'lightbox.js.erb' 
end 

在我路線我:

resources :books do 
    member do 
    get :lightbox 
    end 
end 

在lighbox.js.erb我:

alert("Hello world!"); 

由於某種原因,警報永遠不會被調用。我沒有收到任何錯誤消息,無論是通過服務器還是通過Firebug。我對可能出錯的事情不知所措。有任何想法嗎?

回答

20

事實證明,在客戶端,我的JavaScript被呈現爲文本。我通過查看控制檯源確認了這一點。它說:

Started GET "/books/lightbox?book=4&username=tbaron&_=1344009191129" for 127.0.0.1 at 2012-08-03 10:53:11 -0500 
Processing by BooksController#lightbox as text 

那最後兩個字應該看過「as JS」。在生根後,我發現這個導致了一個令人驚訝的簡單解決方案的blog post。將「dataType:script」添加到AJAX調用中:

$.ajax({ 
    type: 'GET', 
    url: '/books' 
    dataType : 'script' 
} 

感謝您的幫助,大家!

7

我想那是因爲你需要調用books.js

$.ajax({ 
    type: 'GET', 
    url: '/books.js', 
    success: function(data) { 
    eval(data); 
    } 
} 

在索引操作:

def index 
    respond_to do |format| 
    format.js { render 'lightbox'} 
    end 
end 

而且lightbox.js.erb應該在應用程序/視圖/書籍

如果仍然沒有按不工作,請嘗試撥打books/index.js 您也可以使用螢火蟲/鉻合金來檢查服務器對您的迴應Ajax調用

+1

仍然沒有運氣。此外,Firebug確實顯示服務器正在響應。我甚至在AJAX中放了一個成功的回調函數,並且它是觸發的。 – nullnullnull 2012-08-02 23:50:40

+0

你得到的迴應是什麼? – muffinista 2012-08-03 00:01:37

+0

我收到我的代碼作爲迴應。我想知道爲什麼它不會觸發? – nullnullnull 2012-08-03 00:11:20

1

你可以試試這個腳本調用你的行動Java腳本

var post_params = {}; 
var action = '/books/script_action'; 

$.post(action, post_params).success(function (data) { 

    eval(data); 

}).error(function (data) { 

    alert("Erro to call a action controller"); 

}); 

而在你的控制器試試這個。我建議創建一個新的動作

def script_action 
    render 'lightbox.js' 
end 

在routes文件:

match "books/script_action/" => "books#script_action" 
0

嘗試添加該控制器:

respond_to :js 
0

索引中的作用,使無佈局:

def index 
    respond_to do |format| 
    format.js { render 'lightbox', layout: false} 
end 

這是爲我工作。

0

對於任何人在此發生磕磕絆絆,只是想調用一個控制器操作,並以js.erb文件作出響應,我已經通過這種方式實現了它(在Anthony Alberto's Awesome Answer的幫助下)。

控制器動作

def some_action 
    .. 
    respond_to do |format| 
    format.js { render 'some_action' } 
    end 
end 

some_action.js.erb

... 
$('#someActionWrap').html('<%= j render "some/displaypartials/action_partial" %>') 
... 

Ajax調用

var id = '<%= @someresource.id %>'; 
$.get('/someresource/' + id + '/action/', null, function(data){ 
    eval(data) 
}, 'script'); 
0

我甲肝e類似的問題link_to助手,但這已被糾正使用remote:true