Спасибо за чтение!
Так что я относительно новичок в 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 %>");