Вопрос

У меня есть создание действий для формы, которую потенциально генерирует ошибки (т. Е. Имя отсутствует), а затем перенаправляет.

Проблема в том, что когда перенаправление происходит эти ошибки формы теряются. Как я могу пройти эти ошибки формы на сеансе, которая будет отображаться в исходной форме (которая должна быть все еще должна быть заполнена с предыдущими деталями, как в оригинальном поведении 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top