WItajcie,
Proszę o pomoc/sprawdzenie pomysłu wykorzystania JS do odświeżania strony ( lub elementu strony) po wykonaniu customowej akcji w kontrolerze.
Aplikacja to prosty blog
W kontrolerze mam dodatkową akcje publish
Akcja ta zmienia status posta z na published ( to tylko przykład aby lepiej zrozumieć )
Dodałem w widoku index link do akcji publish. Chciałbym aby po kliknięciu przycisku publish post zmienił status na published bez przeładowania całej strony ale tylko wiersza którym znajduje się post.
def publish
post = Post.find(params[:id])
post.update(status: 'published')
redirect_to posts_path, notice: 'Post published'
respond_to do |format|
format.js
end
end
mój index.html.erb
<%= notice %>
<h1>Posts</h1>
<table>
<thead>
<tr>
<th>Title</th>
<th>Content</th>
<th>Status</th>
<th colspan="4"></th>
</tr>
</thead>
<tbody>
<% @posts.each do |post| %>
<div class='list_of_posts'>
<%= render 'post', post: post %>
</div>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Post', new_post_path %>
_post.html.erb
<div id="<%= dom_id(post) %>"> <tr> <td><%= post.title %></td> <td><%= post.content %></td> <td><%= post.status %></td> <td><%= link_to 'Publish', publish_post_path(post), method: :post, remote: true %></td> <td><%= link_to 'Show', post %></td> <td><%= link_to 'Edit', edit_post_path(post) %></td> <td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> </div>
publish.js.erb
$("#<%= dom_id(@post) %>").replaceWith('<%= escape_javascript(render @post) %>');
routes.rb
resources :posts do member do post 'publish' end end
Czy w akcji publish potrzebny jest redirect - czy bez tego można osiągnąć cel bez tego reridecta ? Czy to jest poprawne podejście? Nie do końca wiem jak sprawdzić czy to działa w odpowiedni sposób po redirect renderuje mi każdy z elementów index mogę to zobaczyć w konsoli.
Proszę o podpowiedź co powinienem zmienić co dodać aby wszystko działało jak należy.