#ruby-on-rails-3 #validation #controller
#ruby-on-rails-3 #проверка #контроллер
Вопрос:
хорошо, итак, в принципе, у меня есть обычная форма для моей модели:
= form_for @operator do |f|
blah blah blah
В моем контроллере operators у меня есть это:
def new
@operator = Operator.new
@operator.build_user
respond_to do |format|
format.html {}
end
end
def create
@user = User.create(params[:operator].delete(:user))
@user.update_attributes(:login => @user.email)
@operator = Operator.new(params[:operator].merge(:user => @user))
respond_to do |format|
if @operator.save
format.html {redirect_to new_operator_aircraft_path(@operator)}
else
format.html { render :action => "new", :error => @operator.errors }
end
end
end
очень простой материал. У меня есть некоторые validates_presence_of
вещи в моей модели, поэтому, естественно, когда я отправляю свою форму, она должна показать мне, что у меня есть ошибки (и сохранить заполненные мной поля)
Пока все в порядке? да. Проблема в том, что, похоже, я отправляю в /operators и это то, что отображается. Кажется, я забыл о том, что происходит в Rails2.3 , но разве меня не следует снова перенаправить в /operators / new? или это было предполагаемое поведение с самого начала?
Ответ №1:
Вот о чем, я думаю, вы спрашиваете:
Почему после отправки формы с ошибками URL-адрес читается «/operators», а не «/ operators / new».
Благодаря ресурсоемкой маршрутизации, при отправке формы через POST в «/operators» в OperatorsController вызывается действие create. Если вы столкнулись с ошибками при сохранении вашего оператора, вы поручили контроллеру выполнить новое действие в рамках того же запроса.
render :action => "new", :error => @operator.errors
Это означает, что перенаправление не происходит, и поэтому URL остается «/operators».
Если произойдет перенаправление, вы потеряете всю информацию о состоянии объекта @operator в текущем запросе, включая ошибки, с которыми вы столкнулись, а также значения формы, которые вы только что отправили.
Другими словами, работает так, как задумано.