Rails 3.1 проверка вложенных форм

#ruby-on-rails #ruby-on-rails-3 #formtastic

#ruby-on-rails #ruby-on-rails-3 #formtastic

Вопрос:

Я использую Formtastic 2 для вложенной формы — у меня есть модель меню и питания, в меню много блюд, каждое блюдо относится к одному меню. Я добавил форму приема пищи в действие отображения меню, прямо под списком уже связанных блюд.

Создание блюд работает нормально, если проверка прошла успешно, я снова перехожу к действию «Показать меню» с перечислением созданного блюда в списке.

Но когда питание не проверяется, и я снова перехожу к действию меню «Показать» с соответствующим флэш-сообщением, мне бы очень хотелось заполнить форму данными, которые были отправлены ранее, и отобразить ошибки рядом с ним.

Я пробовал с этим перенаправлением:

 redirect_to(menu_path(menu,@meal), :alert => 'The meal was not created')
  

Но я не могу получить переменную meal и передать ее обратно в форму таким образом, сам запрос является запросом GET только с идентификатором меню.

Ответ №1:

Вы не должны перенаправлять после ошибок проверки, потому что вы потеряете все состояние. Просто старый шаблон непосредственно после неудачной проверки. Небольшая ошибка заключается в том, что вам нужно использовать flash.now[:alert] , чтобы она не переходила на следующую страницу.

Обычно у вас будет такая структура:

 def new
  @meal = Meal.new
end

def create
  @meal = Meal.new(params[:meal])
  if @meal.save
    flash[:notice] = "Meal was created"
    redirect_to menu_path(menu, @meal)
  else
    flash.now[:alert] = "The meal was not created"
    render :new
  end
end
  

Комментарии:

1. Вы правы, хотя я обнаружил, что моей первоначальной проблемой было неправильное понимание структуры контроллера. У меня были MenuController и MealController с полным CRUD — но при добавлении блюд в действие показа меню код для добавления блюда, вероятно, должен быть в MenuController, когда это единственное место, где создаются блюда. Я могу полностью избавиться от MealController.