Лучший способ сохранить данные формы при ручном обратном перенаправлении? - PullRequest
0 голосов
/ 11 ноября 2009

У меня есть форма, которая при отправке требует, чтобы клиент просмотрел данные, а затем подтвердил изменения перед сохранением данных.

Однако я использую очень грубый способ сохранения данных, если пользователь нажимает кнопку «Назад», чтобы вернуться и просмотреть данные перед отправкой. Поскольку я хочу, чтобы пользователь обновлял поля, а не текущие поля базы данных, чтобы они отображались в этом действии «вернуться», я должен передать значения через параметры post / get. Так что мой контроллер выглядит примерно так:

    @customer = Customer.find session[:id]
    unless params[:customer].nil?
        @customer.attributes = params[:customer]
    end

Есть ли лучший способ сделать это? Мне действительно очень любопытно, каково общепринятое использование сеанса Rails, так как я почти уверен, что использование сеанса для передачи информации, как это, является табу. Да нет? Мысли? Спасибо.

1 Ответ

0 голосов
/ 11 ноября 2009

Там может быть лучший способ сделать это с помощью сессий. Я бы предпочел избегать использования хеша сессии целиком, со второй формой и большим количеством javascript.

Вот как я справлюсь с этим. Первая форма вообще ничего не изменит, просто отправьте на новое действие под названием review.

Действие рецензирования отобразит изменения для рецензирования, и у них будет ссылка для редактирования и видимая кнопка подтверждения. Он также воссоздает форму с предыдущей страницы в скрытом элементе, который снова будет отправлен в действие проверки.

Кнопка подтверждения отправит ваше действие по обновлению.

При нажатии на ссылку редактирования скрывается область обзора и показываются дубликаты с предыдущей страницы.

Вот пример кода, который поможет вам разобраться:

приложение / контроллеры / example_controller.rb

class ExampleController < ApplicationController

  def edit
    @example = Example.find(params[:id])
  end

  def review
    @example = Example.find(params[:id])
    @example.update_attributes(params[:example])
    @example.valid?
  end

  def update
    @example = Example.find(params[:id])
    @example.update_attributes(params[:example])
    if @example.save
      redirect_to @example
    else
      render :action => :review
    end
  end
end
* ** 1017 1018 * приложение / просмотров / примеры / _form.html.erb:
<% form_form @example, :url => {:action => "review"} do |f|%>
  ...
    Form inputs go here
  ...
<% end %>

приложение / просмотров / примеры / edit.html.erb:

 <%= render :parital => form %>

приложение / просмотров / примеры / review.html.erb:

 <div id="review">
   ...
     content for review goes here
   ...
   <%= link_to_function "Edit", "$('review').hide(); $('edit').show()"
   <% form_for @example do |f| %>
     <%= hidden_field :attribute, @example.attribute %>
     ...
       hidden_field for each attribute
     ...
     <%= submit_tag "Accept These Changes" %>
   <% end %>
 </div>
 <div id="edit" style="display:none">
   <%= render :partial => 'form' %>
 </div>
...