0

按照 Railscasts #38 http://railscasts.com/episodes/38-multibutton-form中的有用教程,我为我的“新建”/“创建”控制器操作设置了一个“预览”按钮。

但是当我对“编辑”/“更新”使用相同的方法时,似乎出现了问题。

我似乎无法让我的表格持续存在。

这是我的控制器的样子:

def update
    stylesheets << 'feature'

    @feature = Feature.find(params[:id])

    case params[:submit]
        when "Preview" 
            render :action => "edit"
        return

        when "Update" 
            respond_to do |format|
                if @feature.update_attributes(params[:feature])
                    flash[:notice] = 'Feature was successfully updated.'
                    format.html { redirect_to(features_path) }
                    format.xml  { head :ok }
                else
                    format.html { render :action => "edit" }
                    format.xml  { render :xml => @feature.errors, :status => :unprocessable_entity }
                end
            end
        return
    end

end

当我点击预览按钮时,我按预期返回到编辑屏幕,但我的编辑不会持续存在。有小费吗?很好奇,因为这适用于预览新对象。

4

1 回答 1

2

这里发生的情况是,在渲染视图之前,您实际上并没有将用户对内存模型所做的更改应用到内存模型中,因此更改会丢失。

尝试像这样更改您的“预览”案例:

when "Preview"
  @feature.attributes = params[:feature]
  render :action => "edit"
  return

我要说的一件事是,我还会考虑将该方法拆分一下,以使其更易于阅读和测试。像这样的东西:

before_filter :set_stylesheets

def set_stylesheets
  stylesheets << 'feature'
end

def update
  @feature = Feature.find(params[:id])
  preview if params[:submit] == 'Preview'
  apply_update if params[:submit] == 'Update'
end

def preview
  @feature.attributes = params[:feature]
  render :action => "edit"
  return
end

def apply_update
  # Rest of update action here.
end

这可以帮助您保持测试简单并一次只专注于一种方法,并且应该使代码更易于维护。

于 2012-11-20T00:59:17.447 回答