我有一个表单,在提交时,要求客户查看数据,然后在保存数据之前确认更改。
但是,如果用户点击后退按钮返回并在提交前查看数据,我会使用非常粗略的方法来保留数据。由于我希望用户对字段而不是当前数据库字段进行更新,因此要显示此“返回”操作,我必须通过post / get params传递值。所以我的控制器看起来像:
@customer = Customer.find session[:id]
unless params[:customer].nil?
@customer.attributes = params[:customer]
end
有更好的方法吗?我真的很好奇普遍接受的Rails会话使用是什么,因为我很确定使用会话来传递信息,这是禁忌。是的,不是吗?思考?感谢。
答案 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>