1

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

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

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

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

4

1 回答 1

0

可能有一个更好的方法来做到这一点涉及会话。我宁愿避免完全使用会话哈希,使用第二种形式和大量的 javascript。

这是我的处理方式。第一个表单根本不会有太大变化,只需提交一个名为审核的新操作。

审核操作将显示更改以供审核,并显示一个编辑链接和一个确认按钮。它还将在隐藏元素中从上一页重新创建表单,该隐藏元素将再次提交给审核操作。

确认按钮将提交给您的更新操作。

单击编辑链接将隐藏审阅区域并显示与上一页重复的内容。

这里有一些示例代码来强调这一点:

应用程序/控制器/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>
于 2009-11-11T15:22:18.380 回答