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

私が言いたいことの 1 つは、そのメソッドを少し分割して、読みやすくテストしやすくすることも考えているということです。このようなもの:

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

これにより、テストをシンプルに保ち、一度に 1 つのメソッドに集中することができ、コードの保守が容易になります。

于 2012-11-20T00:59:17.447 に答える