Формы Multibutton Rails работают для New, но не для Edit.

Следуя полезному руководству по 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 ответ

Решение

Здесь происходит то, что вы фактически не применяете изменения, внесенные пользователем в модель в памяти, перед рендерингом своего представления, поэтому изменения теряются.

Попробуйте изменить вариант "Предварительный просмотр" следующим образом:

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

Это поможет вам сделать ваши тесты простыми и сфокусированными на одном методе за раз, а также облегчит сопровождение кода.

Другие вопросы по тегам