Формы 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
Это поможет вам сделать ваши тесты простыми и сфокусированными на одном методе за раз, а также облегчит сопровождение кода.