在手动后退重定向上保留表单数据的更好方法是什么?

时间:2009-11-11 14:20:52

标签: ruby-on-rails forms session confirmation

我有一个表单,在提交时,要求客户查看数据,然后在保存数据之前确认更改。

但是,如果用户点击后退按钮返回并在提交前查看数据,我会使用非常粗略的方法来保留数据。由于我希望用户对字段而不是当前数据库字段进行更新,因此要显示此“返回”操作,我必须通过post / get params传递值。所以我的控制器看起来像:

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

有更好的方法吗?我真的很好奇普遍接受的Rails会话使用是什么,因为我很确定使用会话来传递信息,这是禁忌。是的,不是吗?思考?感谢。

1 个答案:

答案 0 :(得分:0)

可能有一种更好的方法来参与会话。我宁愿完全避免使用会话哈希,使用第二种形式和大量的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

应用/视图/示例/ _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>