Ajax成功回调ruby on rails

时间:2014-07-18 12:02:12

标签: javascript jquery ruby-on-rails ruby ajax

你想在我的ruby on rails教程中实现ajax,控制器将返回一个处理ajax请求的对象。我不知道在我的javascript文件中处理响应。 我想根据javascript文件中返回的对象更新一些div。

以下是我在showcomments.js.erb

中所写的内容
$('.show_comment').bind('ajax:success', function() {
    $(this).closest('tr')="Something here from the object returned");
});

我调用ajax调用的链接是通过这行代码

 <td><%= link_to 'Show Comment', :action => 'showcomment' , :id =>article, :remote => true ,:class=>'show_comment' %></td>

处理此请求的我的控制器操作就像这样

def showcomment
   @article = Article.find(params[:article_id])
   @comment = @article.comments.find(params[:id])
    respond_to do |format|
      format.js{ render :nothing => true }
    end
end

如何做到这一点?

3 个答案:

答案 0 :(得分:3)

我只是想尝试扩展其他答案。

在将:remote => true添加到链接时的rails中,它基本上处理了jquery ajax调用的第一部分。这就是你不需要bind.(ajax:success, function(){ # do stuff here });

的原因

这是典型的jquery ajax调用

$.ajax({
  url: "test.html",
  type: "POST"
}).done(function() {
  $( this ).addClass( "done" );
});

Rails负责第一部分,直到.done回调。所以你的javascript erb模板中的任何内容都会像这样放在回调中

.done(function() {
  #your showcomments.js.erb file is inserted here
});

要从控制器渲染showcomments.js.erb模板,只需执行此操作

def showcomment
  @article = Article.find(params[:article_id])
  @comment = @article.comments.find(params[:id])
  respond_to do |format|
    format.js
  end
end

在format.js之后你不需要任何东西,因为那时的默认rails动作是渲染一个与动作同名的js模板,在这种情况下它是showcomment.js.erb

现在您知道在点击该链接时,它将直接呈现showcomment模板,并且其中的任何javascript将立即运行。 Rails使用ajax非常简单。我希望有所帮助。

答案 1 :(得分:2)

将showcomment更改为:

def showcomment
   @article = Article.find(params[:article_id])
   @comment = @article.comments.find(params[:id])
    respond_to { |format| format.js }
end 

在showcomments.js.erb中,您可以访问对象@article@comment。 示例用法如下:

$('#yourdiv').html('<%= @article.name %>');

答案 2 :(得分:0)

在回复js格式时,您不会渲染任何内容。因此,showcomments.js.erb中的代码未经过评估。移除控制器中的{ render :nothing => true }并在showcomments.js.erb中执行任何操作。顺便说一句,你不需要ajax:success事件。这已经是请求的结束。

showcomments.js.erb

$('.show_comment').closest('tr').html("<%= # you may render partial here or whatever %>");