Ruby on Rails: удаление поста с Ajax в навигации и отображение следующего - PullRequest
0 голосов
/ 29 августа 2018

Спасибо за чтение!

Так что я относительно новичок в RoR (Rails 5) и пытаюсь отображать посты пользователя в частичном (_posts_panel.html.erb), который содержит еще один частичный элемент: навигацию (_posts_navigation.html.erb). Я использую Ajax, чтобы показать сообщения при нажатии в навигации, которая работает нормально.

Теперь я хочу использовать его для удаления поста. Пост уничтожается, когда я нажимаю на кнопку, и мне удалось удалить его в навигации.

Что не работает:

  • следующий пост должен отображаться на панели после удаления
  • когда не осталось ни одного сообщения, я хочу перезагрузить панель, потому что должен быть обработан другой фрагмент (_posts_empty.html.erb)

Мой код:

_posts_panel.html.erb: (отображается в show.html.erb пользователя)

<% if @user.simple_posts.empty? %>
  <%= render 'simple_posts/shared/posts_empty' %>
<% else %>

  <div id="post-navigation">
    <%= render 'simple_posts/shared/posts_navigation' %>
  </div>

  <%= simple_posts_edit_button(current_user, @simple_post)%>
  <%= simple_posts_delete_button(current_user, @simple_post)%>   #button helper

  <div id="show_post">
    <%= render @simple_post %>
    <%= yield %>
   </div>

  <%end %>

_posts_navigation.html.erb

<div class="bootstrap-vertical-nav">
  <ul class="nav flex-column">
    <% @user.simple_posts.reverse_each do |post|%>
      <li class="nav-item" id="<%= @simple_post.id %>">
        <%= link_to post.title, user_simple_post_path(@user, post), remote: true, class:"nav-link text-dark" %>
      </li>
    <% end %>
  </ul>
</div>

<% if @user.id == current_user.id %>
  <%= link_to "+ New Post", new_user_simple_post_path(current_user), class: "btn btn-info w-100", role: "button" %>
<% end %>

destroy.js.erb

$('li#<%= @simple_post.id %>').remove();

simple_posts_controller.rb

def destroy
    @simple_post.destroy
    @simple_post =current_user.simple_posts.first
    respond_to do |format|
    #   format.html { redirect_to simple_posts_url, notice: 'Simple post was successfully destroyed.' }
      format.js
    end
  end

Я пытался добавить в destroy.js.erb тот же код из сообщения $('#show_post').html("<%= escape_javascript render @simple_post %>");, но он работает неправильно. При удалении первого поста (но только этого) показывается следующий, но пост не удаляется из навигации. Я тоже попробовал $('#post-navigation').html("<%= escape_javascript render partial: 'simple_posts/shared/posts_navigation' %>"); и ничего не происходит.

Также я попытался перезагрузить всю панель с $('#post-panel').html("<%= escape_javascript render partial: 'simple_posts/shared/posts_panel' %>"); в show.html.erb пользователя, но снова: ничего. Я не уверен, нужно ли мне указывать, в каком представлении или частичном именно оно должно отображать частичное

Я действительно не знаю, как подойти к этому дальше.

Редактировать 1

ButtonHelper.rb
def simple_posts_delete_button(current_user, simple_post)
    if(current_user.id == @user.id)
      link_to svg('x-square'), [current_user, simple_post], remote: true, method: :delete, class:"btn"
    end
  end

Редактировать 2

шоу-экшн от simple_posts_controller.rb

  def show
    @user = User.find{params[:id]}
    @simple_post = SimplePost.find(params[:id])
      respond_to do |format|
      format.js
      format.html # show.html.erb
    end
  end

show.js.erb

$('#post-actions').html("<%=  j render partial: 'simple_posts/shared/posts_actions', locals: {simple_post: @simple_post, user: @user} %>");
$('#show-post').html("<%= j render @simple_post %>");

1 Ответ

0 голосов
/ 29 августа 2018

Есть несколько проблем с вашими частями:

  • Во-первых, чтобы удалить пост из вашей навигации, вам просто нужно обновить партиал, пост уже уничтожен / удален.
  • После уничтожения, @simple_post в вашем помощнике по кнопкам не обновляется с помощью ajax и все еще происходит из users_controller (где вы устанавливаете его в первый раз, как я предполагаю)

Вы можете поместить свои кнопки действий в новый партиал и указать местных жителей.
Вы также можете заключить html в основной div для последнего обновления (когда все сообщения удалены)

_posts_panel.html.erb:

<div id="panel">
  <% if @user.simple_posts.empty? %>
    <%= render 'simple_posts/shared/posts_empty' %>

  <% else %>
    <div id="post-navigation">
      <%= render partial: 'simple_posts/shared/posts_navigation', locals: { simple_post: @simple_post } %>
    </div>

    <div id="post-actions"> #<-- new partial
      <%= render partial: 'simple_posts/shared/posts_actions', locals: { simple_post: @simple_post } %>
    </div>

    <div id="show_post">
      <%= render @simple_post %>
      <%= yield %>
    </div>

  <% end %>
</div>

_posts_actions.html.erb:

<%= simple_posts_edit_button(current_user, simple_post)%>
<%= simple_posts_delete_button(current_user, simple_post)%>

Обратите внимание, что вы больше не используете переменную экземпляра @simple_post, а локальную.


Теперь вы можете написать свой JS, как это:

destroy.js.erb:

<% if @simple_post %> //<-- check if "@simple_post = current_user.posts.first" still exists after destroy
  $('#post-navigation').html("<%= j render partial: 'simple_posts/shared/posts_navigation', locals: { simple_post: @simple_post } %>");
  $('#post-actions').html("<%= j render partial: 'simple_posts/shared/posts_actions', locals: { simple_post: @simple_post } %>");
  $('#show_post').html("<%= j render @simple_post %>");

<% else %>
  $('#panel').html("<%= j render partial: 'simple_posts/shared/posts_empty' %>");
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...