1

Question

I have a list of bloggers. Using ajax I click on edit to edit a specific record. I edit that record and click update. Using ajax still, I fadeIn the list of all the records -- the old record should be removed from the list of records, and in its place is the updated record with its new values.

Answer: Code for Crud actions on a list of bloggers using ajax, including update:

bloggers_controller.rb

class BloggersController < ApplicationController
  before_action :set_blogger, only: [:show, :edit, :update, :destroy]

  def index
    @bloggers = Blogger.all
    respond_to do |format|
          format.html
          format.js
    end
  end

  def show
    respond_to do |format|
         format.html { redirect_to bloggers_url }
         format.js
    end
  end


  def new
    @blogger = Blogger.new
    respond_to do |format|
         format.js
    end
  end


  def edit
    respond_to do |format|
         format.html { redirect_to bloggers_url }
         format.js
    end
  end

  def create
    @blogger = Blogger.new(blogger_params)
    respond_to do |format|
      @blogger.save
        format.html { redirect_to bloggers_url }
        format.js
    end
  end

  def update
    @blogger.update!(blogger_params)
    respond_to do |format|
         format.html { redirect_to bloggers_url }
         format.js
    end
  end

  def destroy
    @blogger.destroy
    respond_to do |format|
       format.html { redirect_to bloggers_url }
       format.js
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
     def set_blogger
      @blogger = Blogger.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def blogger_params
      params.require(:blogger).permit(:name, :age, :about)
    end
end

views/bloggers/_blogger.html.erb

<tr id="blogger-<%= blogger.id %>" class="blogger">
    <%= form_for blogger, remote: true do |f| %>
            <td><%= blogger.name %></td>
            <td><%= blogger.age %></td>
            <td><%= blogger.about %></td>
            <td><%= link_to 'Show', blogger, remote: true %></td>
            <td><%= link_to 'Edit', edit_blogger_path(blogger), remote: true %></td>
            <td><%= link_to 'Destroy', blogger, method: :delete, data: { confirm: 'Are you sure?' }, remote: true %></td>
    <% end %>
</tr>

views/bloggers/_edit.html.erb

    <h1>Editing blogger</h1>

    <%= render 'form' %>


    <%= link_to 'Back', bloggers_path, remote: true%>

</div>

views/bloggers/_form.html.erb

<%= form_for(@blogger, remote: true) do |f| %>
  <% if @blogger.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@blogger.errors.count, "error") %> prohibited this blogger from being saved:</h2>

      <ul>
      <% @blogger.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :age %><br>
    <%= f.number_field :age %>
  </div>
  <div class="field">
    <%= f.label :about %><br>
    <%= f.text_area :about %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

views/bloggers/_show.html.erb

<div id="show_blogger">
    <p id="notice"><%= notice %></p>

    <p>
      <strong>Name:</strong>
      <%= @blogger.name %>
    </p>

    <p>
      <strong>Age:</strong>
      <%= @blogger.age %>
    </p>

    <p>
      <strong>About:</strong>
      <%= @blogger.about %>
    </p>

    <%= link_to 'Edit', edit_blogger_path(@blogger), remote: true %> 
    <%= link_to 'Back', bloggers_path, remote: true%>

</div>

views/bloggers/create.js.coffee

$newBlogger = $('<%= j render(@blogger) %>').css("color", "#4F8A10").hide()
$("#all_bloggers").append($newBlogger)
$('#new_blogger').fadeOut 100, ->
    $newBlogger.effect('highlight', {color: '#DFF2BF'}, 1000)
    $newBlogger.animate({"color": "black"}, 1000).dequeue()
    $('#new_link').fadeIn(100).dequeue()

$('#new_blogger').remove()

views/bloggers/destroy.coffee

$('#blogger-<%= @blogger.id %>').fadeOut 200, ->
    this.remove()

views/bloggers/edit.js.coffee

$form = $('<%= j render("edit") %>').hide()
$bloggers = $('#listing_bloggers')
$bloggers.after($form)

if($bloggers.is(':hidden'))
    #list is already hidden
    $('#show_blogger').remove()
    $form.fadeIn 100

else
    #list needs to be hidden
    $bloggers.after($form)
    $bloggers.fadeOut 100, ->
        $form.fadeIn 100

views/bloggers/index.html.erb

<div id="listing_bloggers">
    <h1>Listing bloggers</h1>

    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Age</th>
          <th>About</th>
          <th colspan="3"></th>
        </tr>
      </thead>

      <tbody id="all_bloggers">
        <%= render @bloggers %>
      </tbody>
    </table>

    <br>

    <%= link_to 'New Blogger', new_blogger_path, id: "new_link", remote: true %>

</div>

views/bloggers/index.js.coffee

$bloggers = $('#listing_bloggers')

if($bloggers.is(':hidden'))

    if($('#show_blogger').length == 0)
        $bloggers.fadeIn 100
        $("#edit_blogger").remove()
    else
        $('#show_blogger').fadeOut 100, ->
            $bloggers.fadeIn 100

        $('#show_blogger').remove()

views/bloggers/new.js.coffee

$form = $('<%= j render("form") %>').hide()
$('#new_link').after($form)
$('#new_link').fadeOut(100, -> 
    $form.fadeIn(100))

views/bloggers/show.js.coffee

$index = $("#listing_bloggers")
$blogger = $('<%= j render("show") %>').hide()
$index.after($blogger)
$index.fadeOut 100, ->
    $blogger.fadeIn(100)

views/bloggers/update.js.coffee

$('#blogger-<%= @blogger.id %>').replaceWith('<%= j render(@blogger) %>')
$blogger = $('#blogger-<%= @blogger.id %>').css("color", "#4F8A10")

$bloggers = $('#listing_bloggers')
$edit_blogger = $("#edit_blogger")

$edit_blogger.fadeOut 100, ->
    $bloggers.fadeIn 100, ->
        $blogger.effect('highlight', {color: '#DFF2BF'}, 1000)
        $blogger.animate({"color": "black"}, 1000).dequeue()    


$edit_blogger.remove()

1 Answer 1

1

Your blogger - partial should look something like this (in erb):

<div id="blogger-<%= @blogger.id %>" class="blogger">
  ...
</div>

or in haml (much cleaner) :

.blogger{id: "blogger-#{@blogger.id}" }
  -# followed by the rest of your view

and then in your update.js.erb you can just write

$('#blogger-<%= @blogger.id %>').replaceWith('<%= j render(@blogger) %>') 
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.