2014-07-18 5 views
2

Привет, я хочу реализовать ajax в моем рубине на обучающих рейках и контроллер вернет объект при обработке запроса ajax. Я не знаю, как обрабатывать ответ в файле javascript. Я хочу обновить некоторый div на основе объекта, возвращенного в файле javascript.Обратный вызов успеха Ajax в рубине на рельсах

Вот что я написал в моем 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 

Как это можно сделать?

ответ

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 %>'); 
0

Вы не делают ничего при ответе на JS формат. Поэтому код showcomments.js.erb не оценивается. Удалите { render :nothing => true } в контроллере и сделайте все, что хотите, в showcomments.js.erb. BTW вам не нужно ajax:success событие. Это уже конец запроса.

showcomments.js.erb

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

Я просто хотел, чтобы попытаться расширить на другие ответы немного.

В рельсах, когда вы добавляете :remote => true к ссылке, она по существу заботится о первой части вызова jQuery ajax. Вот почему вам не нужно bind.(ajax:success, function(){ # do stuff here });

Это типичный JQuery Ajax вызов,

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

Rails заботится о первой части, до .done обратного вызова. Так что ничего в вашем яваскрипта Еврорадио шаблон помещается в обратный вызов, как этот

.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 очень простым. Надеюсь, это поможет.

+0

Doug, у вас есть ответ js.erb + стрельба ajax: успех в другом файле JS-файла?Я пытаюсь интегрировать fullcalendar, и я использую js.erb для рендеринга ошибок на стороне сервера, но сохраняю код fullcalendar в event.js. –

Смежные вопросы