Это сложная проблема, с которой у меня были проблемы. Первый вопрос, который я хотел бы задать: зачем вам перенаправлять при обнаружении ошибок? Принудительное рендеринг действия при возникновении ошибок было сознательным решением разработчиков среды Rails из-за сложности и удобства использования.
Вот большая проблема, поэтому в вашем действии вы создаете экземпляр модели с использованием params, проверка объекта завершается неудачно, и вы решаете перенаправить на другое действие. Перед перенаправлением на другое действие вам нужно сохранить текущее состояние экземпляра модели в сеансе, а затем перенаправить на action: foo. В действии: foo вам придется повторить попытку обновить атрибуты и передать ошибки представлению через переменную экземпляра. Проблема в том, что вы связываете действия в своем контроллере, что является плохой вещью (одно действие зависит от другого). Есть множество других проблем, которые я мог бы напечатать навсегда, но если вам нужно сделать это только для одного ресурса, вот как я бы это сделал:
конфиг / routes.rb
map.resources :things, :member => { :create_with_errors => :get }
things_controller.rb
def new
@thing = Thing.new
end
def create
@thing = Thing.create(params[:thing])
if @thing.save
redirect_to things_path
else
session[:thing] = @thing
redirect_to create_errors_thing_path(@thing)
end
end
def create_with_errors
@thing = session[:thing]
@errors = @thing.errors
render :action => :new
end
Приложение / просмотров / вещи / new.html.erb
<% if defined?(@errors) %>
<% #do something with @errors to display the errors %>
<% end %>
<!-- render the form stuff -->
Я знаю, о чем ты думаешь ... это отвратительно. Поверьте мне, я предпринял множество попыток решить эту проблему и понял, что механизм, выбранный разработчиками рельсов, является лучшим и самым простым способом устранения ошибок.