2011-11-06 78 views
0

我想在Rails中創建一個自定義動作,它將更新視圖並在div上打印一些信息。Rails 3 - 自定義ajax動作不起作用

我使用寶石進行文件上傳: https://github.com/valums/file-uploader/blob/master/client/fileuploader.js

後上傳成功我想和AJAX頁面有多少毫秒需要更新。

在舊的Rails我會寫有:

def set_tab 
    @diff = count_miliseconds_method 
    render :update do |page| 
    page.replace_html "place_menu", render(:partial => 'place_menu') 
    end 
end 

但我無法弄清楚如何做到這一點的Rails的3.1。

我的自定義操作的控制器代碼:

def custom 
    [...] # Here everything works OK 
    start_time = Time.now 
    Some_method 
    end_time = Time.now 
    @diff = ((end_time - start_time)*100).to_i # counted miliseconds 
    respond_to do |format| 
    format.json {render :json => {:success => true, :time => @diff}, :status => :created, :location => custom_words_path} 
    end 
end 

我custom.js.erb代碼

var el = $('#upload-log'); 
el.append("#{@diff} ms"); 

不幸的是,這並不工作。我得到迴應,例如 {"success":true, "time":324} 但js.erb文件沒有得到執行,頁面沒有包含有關毫秒的信息。

任何想法如何解決這個問題?

更新

Github上回購: https://github.com/there-is-no-spoon/Anagram

回答

1

你返回JSON現在(用Rails 3.1)不包含JavaScript字符串的塊(如以前那樣)。

您需要編寫處理結果的代碼,以便在進行Ajax調用的地方執行代碼。我假設你正在使用jQuery。因此,在您進行Ajax呼叫的地方,執行成功處理程序並執行

var el = $("#upload-log"); 
... 

那裏的東西。

基本上服務器不再返回Javascript,它只是完全在客戶端。

您需要實現文件上傳插件的onComplete方法。閱讀你的js插件的手冊,清楚地提到它。

1

要執行js.erb文件,你必須通過

:format => :js 

到您的路徑生成方法 - 例如:

link_to "My custom action", my_action_path(:format => :js) 
+0

窗口。所以這是個更大的問題,因爲我通過JS插件調用了這個動作。下面是代碼:https://github.com/there-is-no-spoon/Anagram/blob/master/app/views/words/index .html.erb –

+0

閱讀js手冊。你需要爲文件上傳器實現onComplete事件處理程序。 –

+0

我認爲這足以將操作更改爲/words/uploader.js。但@AdityaSanghi建議也可以 - 你可以用onComplete處理程序來實現你想要的。 –