Как я должен идти об интеграции AJAX? - PullRequest
0 голосов
/ 07 апреля 2011

У меня очень грязный код в моем файле update.js.erb, который находится в моем видео-каталоге.Он вызывается каждый раз, когда я добавляю новый comment_title:

$(".comments_div").html('<% @video.comment_titles.each do |comment_title| %> \
<div class ="comment_column_<%= 
 case @video.comment_titles.count 
    when 1 
        "wide" 
    when 2 
        "medium" 
    when 3 
        "narrow" 
    else 
        return 
    end 
%>"> \
    <% unless @video.comment_titles.count == 0 %> \
    <div id = "comment_title_<%= comment_title.id %>" class="comment_title"> \
        <%= comment_title.title %> \
        <%= link_to "x", comment_title_path(comment_title.id), :method => :delete, :remote => true, :class => "comment_title_delete" %> \
    </div> \
        <% comment_title.comments.each do |comment| %> \
            <div class="comment_content">  \
              <%= link_to image_tag(comment.user.profile.photo.url(:tiny)), profile_path(comment.user.profile), :class => "comment_image" %> \
              <div class="textual_comment_content"> \
              <div class="comment_text"> \
                 <span class="name_link"> \
                     <%= link_to "#{comment.user.name}", profile_path(comment.user.profile), :class => "normal" %> \
                 </span> \
                 <%= comment.body.gsub("'",'&apos;') %> \
              </div> \
              <span class="comment_footer"> \
                 <ul> \
                    <li class="list_style"><%= time_ago_in_words(comment.created_at) %> ago</li> \
                    <% unless current_user != comment.user %> \
                        <li><%= link_to "Delete", video_comment_path(:video_id => @video, :id => comment), :method => :delete, :class => "normal" %></li> \
                    <% end %> \
                 </ul> \
              </span> \
              </div> \
            </div> \
        <% end %> \
      </div> \
    <% end %> \
<% end %>');

У меня также есть файл destroy.js.erb, который находится в моей директории comment_title (поскольку метод destroy находится в контроллере comment_titles) и вызываетсявсякий раз, когда я удаляю заголовок комментария.Я хочу иметь тот же код, что и выше, в этом файле уничтожения, чтобы при удалении комментария_титла обновлялся HTML-код.Проблема в том, что @video не определено в моей директории comment_title, поэтому я не могу просто скопировать и вставить код из update.js.erb в destroy.js.erb.Поэтому мой вопрос заключается в том, как лучше всего интегрировать вышеуказанный вызов JS в мой файл уничтожения?

1 Ответ

1 голос
/ 07 апреля 2011

Вам не нужен никакой javascript для уничтожения.Когда вы нажимаете «уничтожить», вы можете просто удалить div.и вам не нужно ничего обновлять.

Ну, на самом деле вам нужен javascript, но не через контроллер, это можно сделать на стороне клиента, если вам действительно не нужно ждать ответа.

Обновление

Предполагается, что вы используете REST.

Массив Ruby для обхода и идентификации ссылок уничтожения комментариев

<% @video.comment_titles.each do |ct| %>
    <%= link_to "Destroy comment", ct, :method => :delete, :confirm => "Are you sure?", :class => 'destroy' %>
<% end %>

jQuery для обработки ссылки уничтожения:

$(document).ready(function() {
    $('a.destroy').live('click', function(event) {

        if ( confirm("Are you sure you want to delete this comment?") )
            $.ajax({
                url: this.href.replace('/delete', ''),
                type: 'post',
                dataType: 'script',
                data: { '_method': 'delete' },
                success: function() {
                    // the item has been deleted
                    // might want to remove it from the interface
                    // or redirect or reload by setting window.location
                }
            });
        return false;
    });
})

Вы комментируете контроллер:

def destroy
    @comment = Comment.find( params[:id] )
    @comment.destroy
    respond_to do |format|
        format.html { redirect_to :back }
        format.js { render :nothing => true }
    end
end

Дайте мне знать, если у вас возникнут ошибки.Я не совсем уверен в ваших маршрутах, так что сложно все угадать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...