Как пройти ошибки формы в сеансе или Flash? [Rails 2.3.5
-
24-09-2019 - |
Вопрос
У меня есть создание действий для формы, которую потенциально генерирует ошибки (т. Е. Имя отсутствует), а затем перенаправляет.
Проблема в том, что когда перенаправление происходит эти ошибки формы теряются. Как я могу пройти эти ошибки формы на сеансе, которая будет отображаться в исходной форме (которая должна быть все еще должна быть заполнена с предыдущими деталями, как в оригинальном поведении error_messages)?
Спасибо!
Код:
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = "Sent."
else
flash[:notice] = "Error."
end
end
Решение
Это сложная проблема, которую у меня были проблемы с самим собой. Первый вопрос, который я спросил, это зачем вам нужно перенаправить, когда найден ошибки? Задавая вас оказывать действию, когда есть ошибки, было сознательное решение дизайнеров рамок Rails из-за сложности и проблемаспособности.
Вот большая проблема, поэтому в ваших действиях вы создаете экземпляр модели, используя параметры, проверка объекта завершается неудачно, и вы решите перенаправить на другое действие. Перед перенаправлением на другое действие вам придется сохранить текущее состояние вашего экземпляра модели на сеанс, а затем перенаправлять на действие: foo. В действии: Foo, вы должны придеться присоединиться к обновлению атрибутов и передавать ошибки к представлению через переменную экземпляра. Выпуск здесь заключается в том, что вы соединили действия в вашем контроллере, что является плохой вещью (одно действие зависит от другого). Есть множество других проблем, которые я мог бы ввести в навсегда, но если вам нужно только сделать это для одного ресурса, вот как я это сделал:
config / marrings.rb.
map.resources :things, :member => { :create_with_errors => :get }
вещи_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 -->
Я знаю, о чем ты думаешь ... это отвратительно. Поверьте мне, я предпринял много попыток решить эту проблему, и я понял, что механизм, которые выбрали разработчики Rails, - лучший и самый простой способ справиться с ошибками.
Другие советы
Конвенция в рельсах состоит в том, чтобы оказать первоначальное действие действий, а не выполнять перенаправление. Таким образом, ваш код будет выглядеть так:
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = 'Sent.'
redirect_to @contact
else
flash.now[:notice] = 'Error.'
render :new
end
end
Если есть какая-либо дополнительная установка, необходимая для выполнения для new
действие, извлечь общий код в личный метод и позвоните в него в before_filter
для обоих new
и create
.