Multibutton Rails表单适用于New,但不适用于Edit

时间:2012-11-20 00:42:13

标签: ruby-on-rails ruby-on-rails-3 forms railscasts

按照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

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

1 个答案:

答案 0 :(得分: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

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