Я разработал программу на 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 выше. Последний элемент заключался в использовании элемента ": отправить" для сброса значения кнопки отправки для создания клиента. Спасибо всем.