【问题标题】:Better way to retain form data on manual back redirect?在手动返回重定向时保留表单数据的更好方法?
【发布时间】:2010-12-15 11:39:53
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails forms session confirmation


    【解决方案1】:

    可能有更好的方法来处理会话。我宁愿避免完全使用会话哈希,使用第二种形式和大量的 javascript。

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

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

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

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

    这里有一些示例代码来说明这一点:

    app/controllers/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
    

    app/views/examples/_form.html.erb:

    <% form_form @example, :url => {:action => "review"} do |f|%>
      ...
        Form inputs go here
      ...
    <% end %>
    

    app/views/examples/edit.html.erb:

     <%= render :parital => form %>
    

    app/views/examples/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>
    

    【讨论】:

    • 那么您会使用 ajax/javascript 显示隐藏元素还是这些整页重定向?
    • 我以为我很清楚,因为它只是 Javascript,但我想不是。我在答案中添加了一个示例。
    • 我觉得你可以只使用review.erb,先显示“编辑”div,然后当你点击“提交”时,它会隐藏自己并显示评论表单。这只是一个观察。如果我要在没有 javascript 的情况下执行此操作,我会更好奇如何执行此操作。即使我要使用 JS,我也希望能够兼容禁用 JS。虽然我同意,但这是一种简单的方法,但我不确定我是否可以通过这种方式。
    • 我认为它可能只涉及“编辑”和隐藏字段“审查”这两种形式。并允许他们来回发布。我正在做的一个解决方案是:gist.github.com/232161
    • 提交到 javascript 的问题是验证错误在发送到确认操作之前不会被捕获。我描述的方法可以很容易地回退到 javascript,方法是让编辑链接回到给定表单作为参数的编辑页面。
    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多