如何在没有表单的情况下保存(或更新)对象

时间:2011-10-25 16:32:33

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 preview

我为CRUD一个对象实现了一个标准的Rails(和RESTful)进程。

我需要的唯一自定义(或“超出约定的配置”)如下:

在标准的修改表单后,我会显示“预览”而不是显示表单(这只是动作“显示” “在视图中进行一些调整并使用”object.status = preview“)此时我需要允许用户使用一个简单的按钮”确认“或”保存“此预览对象。 如果用户再次提交编辑表单(或同一对象)但又不必再次查看。只需点击“确认”按钮即可。

(在更新操作中,我检查object.status是否为“预览”,如果是,我认为它已经确认,我会显示确认消息而不是预览)。

我唯一缺少的是“show”视图中的“确认”按钮 PUT @object。

我该如何实施?

PS:我知道最好的做法是在编辑视图中显示预览(就像在stackoverflow.com中一样),但在我的应用程序中,设计非常重要,所以我需要提供尽可能接近现实的预览。

2 个答案:

答案 0 :(得分:3)

您可能不需要其他操作,只需要另一个视图。基本上流程是这样的:

  1. 用户登陆编辑页面。表单已呈现。他们编辑并提交它......
  2. 调用Update操作。没有“预览”参数可用,因此呈现“预览”视图而不是实际保存表单。
  3. 预览显示预览(如show),但它还有一个隐藏字段(通过CSS)的表单副本和一个名为“previewed”的附加隐藏值,值为“1”。
  4. 当用户点击“确认”时,表单会立即返回到更新操作,然后会看到“预览”参数并实际保存对象并重定向到显示页面。
  5. 这是控制器代码,因为它是最复杂的部分:

    # controller
    def show
      @widget = Widget.new
    end
    
    def edit
      @widget = Widget.find(params[:id])
    end
    
    def update
      previewed = params.delete(:previewed)
    
      @widget = Widget.find(params[:id])
      @widget.attributes = params
    
      if @widget.valid? && previewed
        @widget.save!
        redirect_to widget_path(@widget), :notice => 'Yay'
      elsif @widget.valid?
        render :preview
      else
        render :edit
      end
    end
    

答案 1 :(得分:1)

我认为您需要更改创建操作以呈现您可以创建的Presenter以显示您的数据。只需使用标准的Ruby类并将其设置为显示您想要确认的数据,并添加自定义路由以允许预览/确认URL以PUT到资源。如果您已达到标准resources :object约定,则可能会遇到问题。我想你会想要自己设置节目,编辑和删除路线,以便你可以控制新的/创建路线。

如果您从未使用演示者或不熟悉演示者,那么在线有一些很好的资源。请随时阅读Steve Klabnik关于herehere主题的帖子。