Сброс типа действия с помощью AJAX Resource Maintenance - PullRequest
1 голос
/ 27 декабря 2011

Я разработал программу на Rails 3, которая поддерживает ресурс, т.е. он создает, обновляет, списки и удаляет записи без запросов на обновление экрана. Он использует запросы AJAX для связи с сервером. Каждый запрос обрабатывается контроллером, а затем файл js.erb с кодом JavaScript для обновления DOM передается с сервера для выполнения браузером. С точки зрения пользователя программа работает следующим образом:

Верхняя часть экрана состоит из формы ввода, используемой для вставки и редактирования / обновления записи ресурса. В нижней части экрана перечислены все записи ресурсов с действиями по редактированию и уничтожению в конце каждой строки записи.

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

Проблема в том, что в конце набора действий для редактирования / обновления тип действия на экране "зависает" в режиме обновления, и я не могу переключиться в режим создания снова.

Аналогичным образом, когда я выполняю действие уничтожения, экранное действие остается на «создать» или «обновить» - в зависимости от предыдущего выполненного действия.

В случаях редактирования / обновления и уничтожения я хочу установить следующее действие для создания режима.

Любые мысли о том, как я могу решить эту проблему.

Я пытался использовать функцию attr () JQuery для установки следующего действия без какого-либо успеха.

Некоторые части кода показаны ниже.

Controller code :

class CustomersController < ApplicationController

  before_filter :load

  def load
    @customers = Customer.all
    @customer  = Customer.new
  end

  # Display composite form used for AJAX operations.

  def index   
  end




  # This method implements customer create action for AJAX request.

  def create  
    @customer = Customer.new(params[:customer])
    if @customer.save
      flash[:notice] = "Customer Record Created."
      @customers = Customer.all
      respond_to do |format|
        format.js
      end
    end 

  end 


  # This method get customer for editing using AJAX.

  def edit
    @customer = Customer.find(params[:id])   
    respond_to do |format|
      format.js
    end
  end

  # This method implements customer update from AJAX form.

  def update
    @customer = Customer.find(params[:id])
    if @customer.update_attributes(params[:customer])
      flash[:notice] = "Customer Record Updated."
      @customers = Customer.all
      respond_to do |format|
        format.js
      end 
    end
  end  

  # This method implements customer delete from AJAX form.

  def destroy
    @customer = Customer.find(params[:id])
    @customer.destroy
    flash[:notice] = "Customer Record Deleted"
    @customers = Customer.all
    respond_to do |format|
      format.js
    end

  end

  # This method lists all customers on file. 

  def getcustsjson
    render :json => @customers
  end

  # This method lists all the books purchased by a particular customer.

  def getbooksjson

    @customer = Customer.find(params[:id]) 
    @order = @customer.order
    @orderitems = Orderitem.find_all_by_order_id(@order)
    @book = Book.find_all_by_id(@orderitems)

    render :json => @book 

  end 

end

edit.js.erb file:

editform = "";
editform = editform + '<%= escape_javascript( render('form') ) %>';
alert(" unEscaped editform : " + editform);
$("#customer_form").html(editform);



Update.js.erb file:




 <% if @customer.errors.any? -%> 

   /* Hide the Flash Notice div */
   /* Create an Errors List */
   /* Update the html of the customer_errors div with the Errors List */
   /* Show the customer_errors div */

   $("#flash_notice").hide(300);

   var errlst = "";
   errlst = errlst + "<ul>";
   <% @customer.errors.full_messages.each do |msg| %>
     errlst = errlst + "<li><%= escape_javascript(msg) %></li>";
   <% end %>
   errlst = errlst + "</ul>";

   alert("Errors List : " + errlst);

   $("#customer_errors").html(errlst);
   $("#customer_errors").show(300);

<% else -%>

   /* Hide the customer_errors div */
   /* Update the html of the flash_notice div with the Flash contents */
   /* Clear the form */
   /* Set form for Create Customer mode */
   /* Replace the html of the customers_list div with the updated Customers List */

   $("#customer_errors").hide(300);
   $("#flash_notice").html("<%= flash[:notice] %>");

   $(":input:not(input[type=submit])").val("");
   $(":submit").attr("value", "Create Customer");
   $("form").attr({id:"new_customer", action:"/customers"});

   $("#customers_list").html("<%= escape_javascript render('customers') %>");

<% end %>



Index.html file:


<div id="customer_form"><%= render 'form' %></div>
<div id="customers_list"><%= render 'customers' %></div>


_form.html partial :


<%= form_for(@customer, :remote => true ) do |f| %>

  <div id="customer_errors" style="display:none"></div>

  <div class="field">
    <%= f.label :firstname %>
    <%= f.text_field :firstname %>
    <%= f.label :lastname %>
    <%= f.text_field :lastname %>
  </div>
  <div class="field">
    <%= f.label :email %>
    <%= f.text_field :email %>
    <%= f.label :phone %>
    <%= f.text_field :phone %>
  </div>
  <div class="field">
    <%= f.label :password %>
    <%= f.text_field :password %>
    <%= f.label :address_id %>
    <%= f.text_field :address_id %>
  </div>

  <div id="next_action", class="actions">
    <%= f.submit %>
  </div>
<% end %>



_customers.html partial :


<table>
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
    <th>Email</th>
    <th>Phone</th>
    <th>Password</th>
    <th>Address</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @customers.each do |customer| %>
  <tr>
    <td><%= customer.firstname %></td>
    <td><%= customer.lastname %></td>
    <td><%= customer.email %></td>
    <td><%= customer.phone %></td>
    <td><%= customer.password %></td>
    <td><%= customer.address_id %></td>
    <td><%= link_to 'Edit', edit_customer_path(customer), :remote => true %></td>
    <td><%= link_to 'Destroy', customer, :remote => true, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

РЕДАКТИРОВАТЬ: Проблема решена с помощью функции attr () в JQuery - см. Код для update.js.erb выше. Последний элемент заключался в использовании элемента ": отправить" для сброса значения кнопки отправки для создания клиента. Спасибо всем.

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