2011-11-06 17 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处理程序来实现你想要的。 –